一、概述
1、抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2、抽象工厂模式:一个工厂可以生产一系列产品(一族产品),极大减少了工厂类的数量
3、抽象工厂模式:是所有形式工厂模式中最为抽象和最具有一般性的一种形式
4、抽象工厂模式:中的具体工厂不只是创建一种产品,它负责创建一族产品
二、抽象工厂模式的结构
抽象工厂模式包含以下4个角色
(1)AbstractFactory(抽象工厂)
(2)ConcreteFactoruy(具体工厂)
(3)AbstractProduct(抽象产品)
(4)ConcreteProduct(具体产品)
三、模式优点
1、隔离了具体类的生成,使得客户端不需要知道什么被创建
2、当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象
3、增加新的产品族很方便,无须修改已有系统,符合开闭原则
四、模式缺点
1、增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了开闭原则
五、产品等级结构与产品族
1、产品等级结构:产品等级结构即产品的继承结构
2、产品族:产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品
六、工厂方法和抽象工厂的区别
1、工厂方法模式
(1)每个具体工厂只有一个或者一组重载工厂方法,只能生产一种产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销·
(2)一个抽象产品类,一个抽象工厂类
2、抽象工厂模式
(1)一个工厂可以生产一系列产品(一族产品),极大减少了工厂类的数量
(2)多个抽象产品类,一个抽象工厂类
七、抽象工厂模式示例代码
#include <iostream>
using namespace std;
class RAM
{
public:
virtual void show() = 0;
};
class CPU
{
public:
virtual void show() = 0;
};
class PcRAM : public RAM
{
public:
virtual void show()
{
cout << "Pc的RAM在工作中" << endl;
}
};
class PcCPU : public CPU
{
public:
virtual void show()
{
cout << "Pc的CPU在工作中" << endl;
}
};
class MacRAM : public RAM
{
public:
virtual void show()
{
cout << "Mac的RAM在工作中" << endl;
}
};
class MacCPU : public CPU
{
public:
virtual void show()
{
cout << "Mac的CPU在工作中" << endl;
}
};
class AbstractFactory
{
public:
virtual RAM* createRAM() = 0;
virtual CPU* createCPU() = 0;
};
class PcFactory : public AbstractFactory
{
public:
virtual RAM* createRAM()
{
return new PcRAM;
}
virtual CPU* createCPU()
{
return new PcCPU;
}
};
class MacFactory : public AbstractFactory
{
public:
virtual RAM* createRAM()
{
return new MacRAM;
}
virtual CPU* createCPU()
{
return new MacCPU;
}
};
int main()
{
int id;
cout << "---请输入要选择的平台---" << endl;
cout << "---------1、Pc------------" << endl;
cout << "---------2、Mac-----------" << endl;
AbstractFactory* factory = nullptr;
CPU* cpu = nullptr;
RAM* ram = nullptr;
cin >> id;
if (id == 1)
{
factory = new PcFactory;
cpu = factory->createCPU();
ram = factory->createRAM();
}
else if (id == 2)
{
factory = new MacFactory;
cpu = factory->createCPU();
ram = factory->createRAM();
}
cpu->show();
ram->show();
delete factory;
delete cpu;
delete ram;
return 0;
}