之前提到了 简单工厂模式 。
其主要缺点:
(1)简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响;
(2)工厂类代码会非常臃肿,违背高聚合原则,违背开闭原则。
那么如果实现开闭原则呢?
对于之前的“水果工厂”的例子,使用 工厂方法模式 进行完善,即将工厂也抽象出来,一种具体工厂生产特定的水果。
#include <iostream>
using namespace std;
//抽象的水果
class AbstractFruit
{
public:
virtual void showName() = 0;
};
//苹果
class Apple :public AbstractFruit
{
public:
virtual void showName()
{
cout << "这是苹果" << endl;
}
};
//香蕉
class Banana :public AbstractFruit
{
public:
virtual void showName()
{
cout << "这是香蕉" << endl;
}
};
//鸭梨
class Pear :public AbstractFruit
{
public:
virtual void showName()
{
cout << "这是鸭梨" << endl;
}
};
//抽象工厂
class AbstractFactory
{
public:
virtual AbstractFruit* createFruit() = 0;
};
//实现苹果工厂
class AppleFactory :public AbstractFactory
{
public:
virtual AbstractFruit* createFruit()
{
return new Apple;
}
};
//实现香蕉工厂
class BananaFactory :public AbstractFactory
{
virtual AbstractFruit* createFruit()
{
return new Banana;
}
};
//实现鸭梨工厂
class PearFactory :public AbstractFactory
{
virtual AbstractFruit* createFruit()
{
return new Pear;
}
};
void test01()
{
AbstractFactory* factory = NULL;
AbstractFruit* fruit = NULL;
//创建苹果
factory = new AppleFactory; //创建苹果工厂
fruit = factory->createFruit(); //创建苹果
fruit->showName(); //显示名称
delete fruit; //释放水果
delete factory; //释放工厂
//创建香蕉
factory = new BananaFactory; //创建香蕉工厂
fruit = factory->createFruit(); //创建香蕉
fruit->showName(); //显示名称
delete fruit; //释放水果
delete factory; //释放工厂
//创建鸭梨
factory = new PearFactory; //创建香蕉工厂
fruit = factory->createFruit(); //创建鸭梨
fruit->showName(); //显示名称
delete fruit; //释放水果
delete factory; //释放工厂
}
int main(int argc, int* argv[])
{
test01();
system("pause");
return 0;
}
优点:
(1)不需要记住具体类名,甚至连具体参数都不用记忆;
(2)实现了对象创建和使用的分离;
(3)系统的可扩展性也就变得非常好,无需修改接口和原类。
缺点:
(1)增加系统中类的个数,复杂度和理解度增加;
(2)增加了系统的抽象性和理解难度。
应用场景:
(1)客户端不知道它所需要的对象的类。
(2)抽象工厂类通过其子类来指定创建哪个对象。