设计模式-创建型模式之抽象工厂

2019-02-15  本文已影响0人  gooddaytoyou

定义

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法。但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象

为了更清晰地理解工厂方法模式,需要先引入两个概念:
产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
产品族与产品等级结构示意图

产品族与产品等级结构示意图

当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。
抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。
抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建 。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、有效率。
抽象工厂模式示意图

抽象工厂模式示意图

相关角色
抽象工厂(Abstract Factory):声明生成一系列抽象产品的方法;
具体工厂(Concrete Factory):执行生成一系列抽象产品的方法,生成一系列具体的产品;
抽象产品(Abstract Product):为这一系列的某一种产品声明接口;
具体产品(Product):定义具体工厂生成的具体产品的对象,实现产品接口;
客户(Client):我们的应用程序客户端(不要理解成人),使用抽象产品和抽象工厂生成对象。

解决问题

解决一系列相互依赖对象的创建工作。

UML类图

AbstractFactory.png

例子

抽象工厂生产(AbstractFactory)两种产品(AbstractProductA,AbstractProductB),具体工厂(ConcreteFactory)生产两种具体产品(ConcreteProductA,ConcreteProductB)。
AbstractFactory

public abstract class AbstractFactory {
  public abstract AbstractProductA createProductA();

  public abstract AbstractProductB createProductB();
}

AbstractProductA

public abstract class AbstractProductA {
    public abstract void printA();
}

AbstractProductB

public abstract class AbstractProductB {
    public abstract void printB();
}

ConcreteFactory

public class ConcreteFactory extends AbstractFactory {

    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ConcreteProductB();
    }
}

ConcreteProductA

public class ConcreteProductA extends AbstractProductA {
    @Override
    public void printA() {
        System.out.println("ProductA");
    }
}

ConcreteProductB

public class ConcreteProductB extends AbstractProductB {
    @Override
    public void printB() {
        System.out.println("ProductB");
    }
}

调用

  AbstractFactory abstractFactory = new ConcreteFactory();
  abstractFactory.createProductA();
  abstractFactory.createProductB();

优缺点

优点:

缺点:

延伸

相关的参考

https://www.cnblogs.com/Bobby0322/p/4181931.html

上一篇 下一篇

猜你喜欢

热点阅读