一、应用场景
基于简单工厂模式的缺陷,比如说简单工厂模式要多添加一个产品,那么它不仅需要继承实例一个产品类,而且还需要在工厂类里面新增新产品类的选择。这样的改动的地方还是比较多,更加不太适合在代码量比较大的项目应用,所以通常是应用起来也是比较少。
所以我们需要对原有代码影响降到最小,同时能对原有功能进行扩展的另种方式,就是我们接下来要说讲的工厂模式。
在设计的初期,就考虑到产品在后期会进行扩展的情况下,可以使用工厂方法模式;
产品结构较复杂的情况下,可以使用工厂方法模式;
工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
二、使用步骤
1.UML
2.代码实例
代码如下:
#include <iostream>
using namespace std;
class Product
{
public:
virtual void Show() = 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 Factory
{
public:
virtual Product *CreateProduct() = 0;
};
class FactoryA : public Factory
{
public:
Product *CreateProduct()
{
return new ProductA ();
}
};
class FactoryB : public Factory
{
public:
Product *CreateProduct()
{
return new ProductB ();
}
};
int main(int argc , char *argv [])
{
Factory *factoryA = new FactoryA ();
Product *productA = factoryA->CreateProduct();
productA->Show();
Factory *factoryB = new FactoryB ();
Product *productB = factoryB->CreateProduct();
productB->Show();
if (factoryA != NULL)
{
delete factoryA;
factoryA = NULL;
}
if (productA != NULL)
{
delete productA;
productA = NULL;
}
if (factoryB != NULL)
{
delete factoryB;
factoryB = NULL;
}
if (productB != NULL)
{
delete productB;
productB = NULL;
}
return 0;
}
二、总结
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现产品类,选择判断的问题还是存在,也就是说,工厂方法是把简单工厂的内部逻辑判断移到了客户端代码来进行(main函数的演示过程其实就是我们所说的客户端哈)。假如你想要添加其它产品类,以前你是要改工厂类的,现在只是修改下客户端就行。