抽象工厂模式(Abstract Factory Pattern)

小明的水果店生意特别好又得去批发市场进货,这里有好几家批发商,有卖青苹果、红苹果的,有的卖贡梨、雪梨的,但是顾客一般比较喜欢红苹果和雪梨。如果我们在设计使用工厂方法的时候,需要增加4*2个产品等级结构的类,如果我们使用抽象工厂模式来解决这个 问题那么我们只需要2*2个类就搞定。当系统所提供的工厂的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构属于不同类型的具体产品的时候就可以使用抽象工厂模式。

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

产品等级结构:产品等级结构就是产品继承结构,这里的不同商家的水果就是一个等级结构,比如:红苹果和雪梨,青苹果和贡梨

产品族:在抽象工厂模式中,产品族是指同一个工厂生产的物品,比如:青苹果和红苹果,都是同一个批发商的

抽象工厂的结构

抽象工厂模式(Abstract Factory Pattern)_第1张图片

抽象工厂模式的实现

AbstractFactory(抽象工厂):它声明一组用于创建产品族的方法,每一个产品对应一个方法

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

    public abstract AbstractProductB CreateProductB();

}

ConcreteFactory(具体工厂):它实现在抽象工厂种声明的创建产品的方法,生成一组具体的产品,这些产品构成一个产品族,每一个产品都位于某个产品等级结构中

public abstract class ConcreteFactoryA : AbstractFactory
{
    public abstract override AbstractProductA CreateProductA();

    public abstract override AbstractProductB CreateProductB();

}

AbstractProduct(抽象产品):它为每个产品声明接口,在抽象产品中声明了产品具体的业务方法

public abstract class AbstractProductA
{
}

ConcreteProduct(具体产品):定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法

    public class ConcreteProductA1 : AbstractProductA
    {
    }

抽象工厂模式的优点:

1.抽象工厂模式隔离了具体类的生成,使得客户端并不需要知道什么被创建

2.当一个产品族中的多个对象被设计成一起工作,他能确保客户端始终只使用同一产品族中的对象

3.抽象工厂模式增加新的产品族无需修改已有的系统结构,符合开闭原则

抽象工厂模式的缺点:

1.如果新增加产品等级需要对原系统修改,违背了开闭原则

抽象工厂模式的适用环境

1.产品等级结构稳定,设计完之后不会向系统种增加新的产品结构或者删除以有的产品等级

2.具有多个产品族和产品等级结构

3.一个系统不应该依赖于产品类实例如何被创建,客户无需关心产品是如何创建的

4.同一个产品族的产品可以是没有任何关系的对象,但是他们具有共同的约束

你可能感兴趣的:(设计模式,Abstract,Factory,Pattern,抽象工厂模式,设计模式)