专栏首页java闲聊设计模式之抽象工厂模式

设计模式之抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
  • 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 条评论
登录 后参与评论

相关文章

  • 设计模式之适配器模式适配器模式

    当我们的手机接口Type-A时,但是数据线只有Type-C的时候,就需要用转接口做适配,这种情况下就要增加一个适配器

    tanoak
  • 设计模式之 装饰器模式

    tanoak
  • WebMagic运行原理(初探)

    tanoak
  • (52) 抽象容器类 / 计算机程序的思维逻辑

    查看历史文章,请点击上方链接关注公众号。 从38节到51节,我们介绍的都是具体的容器类,上节我们提到,所有具体容器类其实都不是从头构建的,它们都继承了一些抽象容...

    swiftma
  • 通过简单代码示例了解七大软件设计原则

    本文档设计源码地址:https://gitee.com/daijiyong/SoftwareDesignPrinciples

    你好戴先生
  • 23种设计模式详解(六)

    南风
  • Head First设计模式——蝇量模式和解释器模式

    在一个设计房子的平台中,周围要加上一些树,树有一个坐标XY坐标位置,而且可以根据树的年龄动态将自己绘制出来。如果我们创建许多树之后,会有许多树的实例对象。使用一...

    SpringSun
  • 开源实体映射框架EmitMapper介绍

    EmitMapper是一个开源实体映射框架,地址:http://emitmapper.codeplex.com/。

    跟着阿笨一起玩NET
  • 代理模式

    mySoul
  • 写出优质Java代码的4个技巧

    如果现在要求对你写的Java代码进行优化,那你会怎么做呢?作者在本文介绍了可以提高系统性能以及代码可读性的四种方法,如果你对此感兴趣,就让我们一起来看看吧。

    Java后端工程师

扫码关注云+社区

领取腾讯云代金券