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

2023-12-13 06:48:01
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)。

文章来源:https://blog.csdn.net/myepicure/article/details/134763709
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。