定义:
一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其他子类。
工厂方法通用类图:
这个图更好理解
在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;Creator为抽象创建类,也是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的。
工厂方法模式的应用
工厂方法模式的优点
良好的封装新,代码结构清晰。一个对象创建是有约束条件的,如一个调用者需要一个具体的产品对象,只要知道这个产品的类名(或者约束字符串)就可以了,不知奥创建对象的艰辛过程,降低模块间的耦合。
工厂方法模式是经典的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不用关心。符合迪米特法则,我不需要就不要去交流;也符合依赖倒置原则,只依赖产品的抽象;当然也符合里氏替换原则,使用产品子类替换产品父类。
#include <iostream>
using namespace std;
class Product
{
public:
virtual void show() = 0;
};
class Factory
{
public:
virtual Product* CreateProduct() = 0;
};
class ProductA : public Product
{
public:
void show()
{
cout << "I'm ProductA" << endl;
}
};
class ProductB : public Product
{
public:
void show()
{
cout << "I'm ProductB" << endl;
}
};
class FactoryA : public Factory
{
public:
Product* CreateProduct()
{
return new ProductA();
}
};
class FactoryB : public Factory
{
public:
Product* CreateProduct()
{
return new ProductB();
}
};
int main()
{
Factory* factoryA = new FactoryA();
Factory* factoryB = new FactoryB();
Product* productA = factoryA->CreateProduct();
Product* productB = factoryB->CreateProduct();
productA->show();
productB->show();
if (factoryA != nullptr)
{
delete factoryA;
factoryA = nullptr;
}
if (factoryB != nullptr)
{
delete factoryB;
factoryB = nullptr;
}
if (productA != nullptr)
{
delete productA;
productA = nullptr;
}
if (productB != nullptr)
{
delete productB;
productB = nullptr;
}
return 0;
}
参考:C++设计模式——工厂方法模式 - Ring_1992 - 博客园 (cnblogs.com)