工厂模式,这个是gof 中23个设计模式没有的,后来添加进去的,就是目前大家所了解的24个设计模式。
工厂模式非常简单,优缺点都有。
我们一般会有个抽象工厂,这样让不同的实际工厂去继承,当你在添加其他工厂的时候,不会影响到本来工厂的正常运行,提高了代码的维护性。同样产品一样道理。
下面是我们写的一个类图(第一次画类图,也是程序中的逻辑)
如上图我们建立了一个抽象工厂 ,然后3个不同国家的水果工厂来继承,每个工厂会创建各自的水果,而这些水果都继承到水果的抽象类。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//1 添加一个日本的工厂 和日本的苹果 和 香蕉 (添加一个产品族)
//针对产品族进行添加 符合开闭
//2 添加一个产品种类, 鸭梨 (添加一个产品等级结构)
//针对产品等级机构添加 不符合开闭
//3 考虑 1, 2 是否都符合开闭原则
class Fruit
{
public:
virtual void getName() = 0;
};
class USAApple :public Fruit
{
public:
virtual void getName() {
cout << "我是美国的苹果" << endl;
}
};
class USABanana :public Fruit
{
public:
virtual void getName() {
cout << "我是美国的香蕉" << endl;
}
};
class USAPear :public Fruit
{
public:
virtual void getName() {
cout << "我是美国的梨" << endl;
}
};
class ChinaApple :public Fruit
{
public:
virtual void getName() {
cout << "我是中国的苹果" << endl;
}
};
class ChinaBanana :public Fruit
{
public:
virtual void getName() {
cout << "我是中国的香蕉" << endl;
}
};
class ChinaPear :public Fruit
{
public:
virtual void getName() {
cout << "我是中国的梨" << endl;
}
};
//顶一个一个抽象的工厂,是面向产品族进行生产
class AbstractFactory {
public:
virtual Fruit *createApple() = 0;
virtual Fruit *createBanana() = 0;
//添加一个鸭梨的生成器
virtual Fruit* createPear() = 0;
};
//美国的具体工厂
class USAFactory :public AbstractFactory
{
public:
virtual Fruit *createApple() {
return new USAApple;
}
virtual Fruit *createBanana() {
return new USABanana;
}
//添加一个美国的生产器
virtual Fruit * createPear() {
return new USAPear;
}
};
//中国的工厂
class ChinaFactory :public AbstractFactory
{
public:
virtual Fruit *createApple()
{
return new ChinaApple;
}
virtual Fruit *createBanana() {
return new ChinaBanana;
}
//添加一个的生产器
virtual Fruit * createPear() {
return new ChinaPear;
}
};
//添加一个日本的产品族,工厂,和具体产品 符合 开闭原则
class JapanApple :public Fruit
{
public:
virtual void getName() {
cout << "我是日本的苹果" << endl;
}
};
class JapanBanana :public Fruit
{
public:
virtual void getName() {
cout << "我是日本的香蕉" << endl;
}
};
class JapanPear :public Fruit
{
public:
virtual void getName() {
cout << "我是日本的梨" << endl;
}
};
class JapanFactory :public AbstractFactory
{
public:
virtual Fruit *createApple() {
return new JapanApple;
}
virtual Fruit *createBanana() {
return new JapanBanana;
}
virtual Fruit * createPear() {
return new JapanPear;
}
};
int main(void)
{
//想要一个美国的香蕉
//1 来一个美国的工厂
AbstractFactory * usaF = new USAFactory;
//2 来一个香蕉
Fruit *usaBanana = usaF->createBanana();
usaBanana->getName();
//想要一个中国的苹果
AbstractFactory *chinaF = new ChinaFactory;
Fruit *chinaApple = chinaF->createApple();
chinaApple->getName();
return 0;
}
这就是工厂模型的基本面了,这样添加功能,与维护代码就非常方便。
优缺点:
优点:
1. 不需要记住具体类名,甚至连具体参数都不用记忆。
2. 实现了对象创建和使用的分离。
3. 系统的可扩展性也就变得非常好,无需修改接口和原类。
缺点:
1. 增加系统中类的个数,复杂度和理解度增加。
2. 增加了系统的抽象性和理解难度。
设计模式对我们写代码非常的重要,而且会画类图与其他的图是非常重要的,这样我们可以把思路非常清晰的表达出来。