设计模式(2)--对象创建(1)--抽象工厂

1. 意图

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

2. 四种角色

    抽象产品(Product)、具体产品(Concrete Product)、抽象工厂(Abstract Factory)、具体工厂(Concrete Factory)。

3. 优点

   3.1 分离了具体的类。Client只需使用抽象工厂类和抽象产品类的接口。

   3.2 易于交换产品系列。改变具体工厂很容易。

   3.3 有利于产品的一致性。一次只能使用同已个系列中的对象。

4. 缺点

    4.1 难以支持新种类的产品。

          支持新产品需要修改抽象工厂类及其所有子类工厂。

          一个更灵活但不太安全的方法是给创建对象的操作增加一个参数,该参数指定对象的种类。

5. 相关模式

    5.1 抽象工厂类通常用工厂方法(Factory Method)实现,也可用原型(Prototype)实现。

    5.2 一个具体的工厂通常是一个单件(Singleton) 。

6. 代码示意(C++)
#pragma once
#include <iostream>

using namespace std;

class AbstractProductA
{
public:
    virtual void Show() = 0;
};
class ProductA1 : public AbstractProductA
{
public:
    virtual void Show() {
        cout << "系列1:ProductA" << endl;
    }
};
class ProductA2 : public AbstractProductA
{
public:
    virtual void Show() {
        cout << "系列2:ProductA" << endl;
    }
};

class AbstractProductB
{
public:
    virtual void Show() = 0;
};
class ProductB1 : public AbstractProductB
{
public:
    virtual void Show() {
        cout << "系列1:ProductB" << endl;
    }
};
class ProductB2 : public AbstractProductB
{
public:
    virtual void Show() {
        cout << "系列2:ProductB" << endl;
    }
};

class AbstractFactory
{
public:
	virtual AbstractProductA* CreateProductA() = 0;
	virtual AbstractProductB* CreateProductB() = 0;
};

class ConcreteFactory1 :
    public AbstractFactory
{
public:
    AbstractProductA* CreateProductA() {
        return new ProductA1;
    }
    AbstractProductB* CreateProductB() {
        return new ProductB1;
    }
};

class ConcreteFactory2 :
    public AbstractFactory
{
public:
    AbstractProductA* CreateProductA() {
        return new ProductA2;
    }
    AbstractProductB* CreateProductB() {
        return new ProductB2;
    }
};

#include "AbstractFactory.h"
int main() {

	AbstractFactory* pFactory = new ConcreteFactory1;

	AbstractProductA* pProductA = pFactory->CreateProductA();
	AbstractProductB* pProductB = pFactory->CreateProductB();

	pProductA->Show();
	pProductB->Show();
	
	delete pProductA;
	delete pProductB;
	delete pFactory;
	return 0;
}

运行结果:

6.1 要更换产品系列,只需在main函数里用ConcreteFactory2来替换ConcreteFactory1即可(3.2)。

6.2 但如果要增加新产品ProductC,则AbstractFactory需增加新接口,ConcreteFactory1和

      ConcreteFactory2也要做相应的修改(4.1)。

相关推荐

  1. #设计模式#3.1 抽象工厂

    2023-12-16 04:14:01       15 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-16 04:14:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-16 04:14:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-16 04:14:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-16 04:14:01       18 阅读

热门阅读

  1. 超全面网络安全学习知识——(黑客)自学

    2023-12-16 04:14:01       41 阅读
  2. Mybatis配置-类型别名(typeAliases)

    2023-12-16 04:14:01       36 阅读
  3. log4j2 xml 配置文件 屏蔽 第三方 依赖包 的日志

    2023-12-16 04:14:01       38 阅读
  4. 1050 螺旋矩阵

    2023-12-16 04:14:01       33 阅读
  5. C++容器系列之list详解与应用

    2023-12-16 04:14:01       32 阅读