设计模式-第十一章-抽象工厂模式

一、UML图

二、包含的角色

AbstractProductA和AbstractProductB类,是抽象类。定义了该类型产品的相关操作。

ConcreteProductA1、ConcreteProductA2、ConcreteProductB1和ConcreteProductB2类,是对以上抽象类的具体分类实现。各自通过不同的方式去实现该类产品的相关操作。

AbstractFactory类是抽象工厂类,里面应该包含生产各类(A,B)产品的抽象方法。

ConcreteFactory1和ConcreteFactory2类,具体工厂。生成分别生产特定产品。比如,本例ConcreteFactory1生产的是ConcreteProductA1和ConcreteProductB1这两种产品。

三、特点

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

为创建不同的产品,客户端应使用不同的具体工厂。

          便于交换产品系列。让具体创建实例过程与客户调用分离。客户调用通过接口操作实例,产品具体类也被具体工厂分离,不会出现在客户调用代码中。

四、代码实现

产品AbstractProductA、AbstractProductB 实现

class AbstractProductA {
public:
    AbstractProductA() {
    }

    virtual ~AbstractProductA() {
    }

public:
    virtual void OperationA() = 0;
};
class AbstractProductB {
public:
    AbstractProductB() {
    }

    virtual ~AbstractProductB() {
    }

public:
    virtual void OperationB() = 0;
};

具体产品类ConcreteProductA1、ConcreteProductA2、ConcreteProductB1和ConcreteProductB2

class ConcreteProductA1 : public AbstractProductA
{
  public:
    void OperationA() override
    {
        std::cout<<"OperationA ConcreteProductA1"<<std::endl;
    }
};

工厂AbstractFactory类

class AbstractFactory {
public:
    AbstractFactory() {
    }

    virtual  ~AbstractFactory() {
    }

public:
    virtual AbstractProductA *CreateProductA() = 0;

    virtual AbstractProductB *CreateProductB() = 0;
};

 ConcreteFactory1和ConcreteFactory2类(两个类似,这里也只写了一个)。

class ConcreteFactory1 : public AbstractFactory
{
  public:
    AbstractProductA *CreateProductA() override
    {
        return new ConcreteProductA1();
    }

    AbstractProductB *CreateProductB() override
    {
        return new ConcreteProductB1();
    }
};

frontend

std::unique_ptr<AbstractFactory> factory(new ConcreteFactory1);
std::unique_ptr<AbstractProductA> productA1(factory->CreateProductA());
productA1->OperationA();
std::unique_ptr<AbstractProductB> productB1(factory->CreateProductB());
productB1->OperationB();

factory.reset(new ConcreteFactory2());
std::unique_ptr<AbstractProductA> productA2(factory->CreateProductA());
productA2->OperationA();
std::unique_ptr<AbstractProductB> productB2(factory->CreateProductB());
productB2->OperationB();

以上为抽象工厂模式的最基础实现。意在说明本模式,实际应用中根据需求去更改代码。

如:这里new具体工厂类的操作,还可以根据具体调用需求,在抽象工厂中提取一个创建具体工厂的接口(像简单工厂那样的)。达到屏蔽具体工厂的客户端调用(解耦)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值