一、概念
与简单工厂模式比较,多了一层对工厂类的抽象。
工厂方法模式是把简单工厂的内部逻辑判断移动到客户端代码,原本对工厂类的修改变成了对客户端的修改。
二、应用场景
像玩具工厂类接收玩具名称参数后动态创建该玩具类。
计算器的算术工厂类接收具体的运算符类型后,创建该算术类。
三、优缺点
优点:完全符合开放-封闭原则,降低简单工厂模式的耦合性。
缺点:每创建一个产品都要同时创建一个对应的工厂类。
四、如何写一个工厂方法模式类
1、创建抽象玩具类
// 玩具接口
class Toy
{
public:
virtual string Name() = 0; // 玩具名称
};
2、创建具体玩具类
// 玩具汽车
class CarToy : public Toy
{
public:
string Name() {return "Car.";}
};
// 玩具飞机
class PlaneToy : public Toy
{
public:
string Name() {return "Plane.";}
};
3、创建抽象玩具工厂
// 玩具工厂
class ToyFactory
{
public:
virtual Toy* CreateToy() = 0;
};
4、创建具体玩具工厂
// 汽车玩具工厂
class CarToyFactory : public ToyFactory
{
public:
Toy* CreateToy() {
return new CarToy();
}
};
// 飞机玩具工厂
class PlaneToyFactory : public ToyFactory
{
public:
Toy* CreateToy() {
return new PlaneToy();
}
};
5、实现
int main()
{
ToyFactory *toyFactory = new CarToyFactory();
Toy *toy = toyFactory->CreateToy();
cout << toy->Name() << endl;
toyFactory = new PlaneToyFactory();
toy = toyFactory->CreateCar();
cout << toy->Name() << endl;
return 0;
}