设计模式(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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!