设计模式之工厂方法模式(Factory Method Pattern)
模式定义
工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
类图
代码
//抽象产品类
class Product {
public:
virtual void use() = 0;
//抽象类的析构函数设置为虚函数
virtual ~Product() {}
};
class ProductA : public Product {
public:
void use() override
{
cout << "void ProductA::use()" << endl;
}
};
class ProductB : public Product {
public:
void use() override
{
cout << "void ProductB::use()" << endl;
}
};
//抽象工厂类
class Factory {
public:
virtual Product* createProduct() = 0;
virtual ~Factory() {}
};
class FactoryA : public Factory {
public:
Product* createProduct() override {
return new ProductA();
}
};
class FactoryB : public Factory {
public:
Product* createProduct() override {
return new ProductB();
}
};
void test()
{
//生产产品A
unique_ptr<Factory> factoryA(new FactoryA());
unique_ptr<Product> productA(factoryA->createProduct());
productA->use();
//生产产品B
cout << endl << endl;
unique_ptr<Factory> factoryB(new FactoryB());
unique_ptr<Product> productB(factoryB->createProduct());
productB->use();
}
工厂方法模式的优点
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
- 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
- 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
- 对扩展开放对修改关闭;解决了简单工厂的缺点问题。
工厂方法模式的缺点
- 类的个数容易过多,增加复杂度。
- 增加了系统的抽象性和理解难度。
- 接口的传入参数类型需要一致,且只能对单一变化量接口使用。
- 工厂只能生产一种产品,此弊端可使用抽象工厂模式解决。
使用场景
- 客户只知道创建产品的工厂名,而不知道具体的产品名。
- 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
- 客户不关心创建产品的细节,只关心产品的品牌。