美文网首页
设计模式之抽象工厂模式

设计模式之抽象工厂模式

作者: tanoak | 来源:发表于2018-09-07 21:23 被阅读7次
  • 概述
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

UML

  • code
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 ;

相关文章

网友评论

      本文标题:设计模式之抽象工厂模式

      本文链接:https://www.haomeiwen.com/subject/ongqgftx.html