-
工厂方法模式:一种创建型设计模式
-
应用场景:
简单工厂模式之上,考虑到工厂如果新加产品,需要修改产品类型的枚举,并修改工厂生产产品时,对入参类型判断的代码,当然已验证过的代码被修改后也需要重新验证,违反了开闭原则。
于是工厂方法模式登场:
将生产模式改为一个工厂只专注于生产一种产品。有新产品则创建新工厂,无需改动原本工厂。
-
实现方式:
所有工厂继承自工厂抽象类,均可以生产一种产品。
如果要制作某种产品,就使用该产品所对应的工厂进行生产。
-
优点:
新增产品时,无需改动原本代码,新增产品类与工厂类即可,符合开闭原则。
-
缺点:
每新增一种产品时,就要增加两个类(产品类和它对应的工厂类),当扩展至大量产品种类时,就会产生大量的类,难于管理。
以下是工厂方法模式的简易代码实现
// FactoryMethod.hpp
#include <iostream>
using namespace std;
// 产品抽象类
class Product {
public:
virtual void Show() = 0; // 用于验证产品信息
};
class WoodDesk: public Product {
public:
void Show() {
cout << "WoodDesk" << endl;
}
};
class WoodChair: public Product {
public:
void Show() {
cout << "WoodChair" << endl;
}
};
// 工厂抽象类
class Factory {
public:
virtual Product* CreateProduct() = 0;
};
class DeskFactory: public Factory {
public:
Product* CreateProduct() {
return new WoodDesk();
}
};
class ChairFactory : public Factory {
public:
Product* CreateProduct() {
return new WoodChair();
}
};
主函数中的使用
#include "FactoryMethod.hpp"
int main()
{
Factory* FactoryDesk = new DeskFactory();
Product* DeskWood = FactoryDesk->CreateProduct();
DeskWood->Show();
Factory* FactoryChair = new ChairFactory();
Product* ChairWood = FactoryChair->CreateProduct();
ChairWood->Show();
if (NULL != FactoryDesk) {
delete FactoryDesk;
FactoryDesk = NULL;
}
if (NULL != FactoryChair) {
delete FactoryChair;
FactoryChair = NULL;
}
return 0;
}
控制台输出结果
WoodDesk
WoodChair
网友评论