设计模式之抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
  • code UML
public interface Creator {
    /**
     * 创建产品A
     * @return ProductA
     */
    ProductA createProductA();

    /**
     * 创建产品B
     * @return ProductB
     */
    ProductB createProductB();
}
public class ConcreteCreator1 implements Creator {


    @Override
    public ProductA createProductA() {
        return new ProductA1();
    }

    @Override
    public ProductB createProductB() {

        return new ProductB1();
    }
}
public class ConcreteCreator2 implements Creator {


    @Override
    public ProductA createProductA() {
        return new ProductA2();
    }

    @Override
    public ProductB createProductB() {

        return new ProductB2();
    }
}
public interface ProductA {
    void methodA();
}
public class ProductA1 implements ProductA{
    @Override
    public void methodA() {
        System.out.println("A产品1型号");
    }
}
public class ProductA2 implements ProductA{
    @Override
    public void methodA() {
        System.out.println(" A产品2型号");
    }
}
public interface ProductB {
    void methodB();
}
public class ProductB1 implements ProductB{
    @Override
    public void methodB() {
        System.out.println("B产品1型号");
    }
}
public class ProductB2 implements ProductB{
    @Override
    public void methodB() {
        System.out.println("B产品2型号");
    }
}
  • 测试类
public class Main{

    public static void main(String[] args) {
//      Creator creator = new ConcreteCreator2();
        Creator creator = new ConcreteCreator1();
        ProductA productA = creator.createProductA();
        ProductB productB = creator.createProductB();
        productA.methodA();
        productB.methodB();

        /**
         *  creator = new ConcreteCreator2();
         *         productA = creator.createProductA();
         *         productB = creator.createProductB();
         *         productA.methodA();
         *         productB.methodB();
         */
    }
}

上面代码满足了解耦合与开闭原则,但是也带来了新的问题

  • 优点
    1. 由于具体工厂类,在一个应用中只需要在初始化时出现一次,这使得改变一个应用的具体工厂变得非常容易,只需要改变具体工厂即可
    2. 创建实例的过程与客户端分离,客户端是通过它们的抽象接口操作实例,产品的具体类名被具体工厂的实现分离,不会出现在客户代码中
  • 缺点 代码冗余,新增一个产品类要增加三个类,ConcreteCreator2 ,ProductB ,ProductB2 ;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android群英传

我与 Kotlin 的爱恨情仇之浅谈 block

15040
来自专栏积累沉淀

Java设计模式(十三)----策略模式

策略模式 一、概述 二、策略模式的结构 三、具体案例 四、认识策略模式 一、概述 1.定义 策略模式属于对象行为型模式,主要针对一组算法...

24260
来自专栏向治洪

hello Kotlin

1.1 Kotlin的身世 写了许久 Java,有没有发现其实你写了太多冗余的代码? 后来你体验了一下 Python,有没有觉得不写分号的感觉真是超级爽? 你虽...

21050
来自专栏恰童鞋骚年

设计模式的征途—9.组合(Composite)模式

树形结构在软件中随处可见,比如操作系统中的目录结构,公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题。组合模式通过一种巧妙的设...

15640
来自专栏数据结构与算法

洛谷11月月赛题解(A-C)

辣鸡T3卡我1.5h题意,要不是最后nlh跟我解释了一下大样例估计这次是真凉透了。。

8710
来自专栏深度学习之tensorflow实战篇

计算机常用算法对照表整理

常用对照: NLP CRF算法: 中文名称条件随机场算法,外文名称conditional random field algorithm,是一种数学算法,是2...

54050
来自专栏熊二哥

Java基础组件快速入门

最近需要上线很多新的JAVA项目,然而很多JAVA的相关库都不太熟悉,项目实现起来遇到了不小阻力,熬了好几天夜。现在手头的工作基本完成了,因此打算好好来归纳下j...

34660
来自专栏Android知识点总结

小案例Josn字符串的生成

31520
来自专栏数据结构与算法

cf1043C. Smallest Word(贪心)

这题打cf的时候真的是脑残,自己造了个abcdad的数据开心的玩了半天一脸懵逼。。。最后还好ycr大佬给了个思路不然就凉透了。。。

7010
来自专栏Java后端生活

学Java的颤抖吧!Kotlin成为Android官方开发语言

20640

扫码关注云+社区

领取腾讯云代金券