前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之抽象工厂模式

设计模式之抽象工厂模式

作者头像
tanoak
发布2018-10-10 11:05:57
3600
发布2018-10-10 11:05:57
举报
文章被收录于专栏:java闲聊java闲聊
代码语言:javascript
复制
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
  • code UML
代码语言:javascript
复制
public interface Creator {
    /**
     * 创建产品A
     * @return ProductA
     */
    ProductA createProductA();

    /**
     * 创建产品B
     * @return ProductB
     */
    ProductB createProductB();
}
代码语言:javascript
复制
public class ConcreteCreator1 implements Creator {


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

    @Override
    public ProductB createProductB() {

        return new ProductB1();
    }
}
代码语言:javascript
复制
public class ConcreteCreator2 implements Creator {


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

    @Override
    public ProductB createProductB() {

        return new ProductB2();
    }
}
代码语言:javascript
复制
public interface ProductA {
    void methodA();
}
代码语言:javascript
复制
public class ProductA1 implements ProductA{
    @Override
    public void methodA() {
        System.out.println("A产品1型号");
    }
}
代码语言:javascript
复制
public class ProductA2 implements ProductA{
    @Override
    public void methodA() {
        System.out.println(" A产品2型号");
    }
}
代码语言:javascript
复制
public interface ProductB {
    void methodB();
}
代码语言:javascript
复制
public class ProductB1 implements ProductB{
    @Override
    public void methodB() {
        System.out.println("B产品1型号");
    }
}
代码语言:javascript
复制
public class ProductB2 implements ProductB{
    @Override
    public void methodB() {
        System.out.println("B产品2型号");
    }
}
  • 测试类
代码语言:javascript
复制
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 ;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.09.07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档