在上一节中,我们介绍了简单工厂模式,该模式的特点是我们可以指定工厂去创建什么类型的鞋子类,因为该工厂已经继承了创建所有鞋子类的方法了。但是简单工厂模式的可扩展性较差,一旦我们有新的类型的鞋子需要生产了的话,我们就需要修改工厂类。为了减少对工厂类的修改,提出了工厂方法模式:对每种鞋子都分配一个工厂类,也就是说每个工厂类都只负责生产一类鞋子。这样,一旦有了新种类的鞋子需要生产的时候,我们可以再扩展一个鞋子工厂去负责生产这类鞋子。所以,工厂方法模式又称之为流水线模式。
如上图所示,一共需要四种类:抽象产品类、具体产品类、抽象工厂类、具体工厂类。
1. 抽象类
在抽象类中一共包括抽象产品类以及抽象工厂类两种,其中抽象产品类是对鞋子类的属性以及方法的抽象,而抽象工厂类是对工厂类的属性已经方法的抽象。
class Shoes{
public:
Shoes(){};
virtual ~Shoes(){};
virtual void show() = 0;
};
class Factory{
public:
Factory(){};
virtual ~Factory(){};
virtual Shoes* produce() = 0;
};
2. 具体产品类
在具体产品中主要包括Nike鞋子以及LiNing鞋子类的实现:
class Nike: public Shoes{
public:
Nike(){};
~Nike(){};
void show(){
cout << "这是Nike鞋子" << endl;
};
};
class LiNing: public Shoes{
public:
LiNing(){};
~LiNing(){};
void show(){
cout << "这是LiNing鞋子" << endl;
};
};
3. 具体工厂类
在具体工厂类中,每个工厂类都负责生产一种类别的鞋子:
class NikeFactory: public Factory{
public:
NikeFactory(){};
~NikeFactory(){};
Nike* produce(){
cout << "这是NikeFactory工厂" <<endl;
return new Nike();
};
};
class LiNingFactory: public Factory{
public:
LiNingFactory(){};
~LiNingFactory(){};
LiNing* produce(){
cout << "这是LiNingFactory工厂" << endl;
return new LiNing();
}
};
4. 主函数测试
在主函数中,我们需要创建两类鞋子工厂的对象指针,然后再生产鞋子:
int main(){
NikeFactory* nike = new NikeFactory();
LiNingFactory* liNing = new LiNingFactory();
// 使用两条生产线生产nike产品和lining产品
nike->produce()->show();
liNing->produce()->show();
return 0;
}
将上述所有代码都放在一个文件下执行,下面就是对上述代码的运行结果:
5. 小结
工厂方法类(流水线方法类)增加了简单工厂模式的可扩展性,但是该类模式依然存在一定的不如,比如每个工厂类只能够生产鞋子这样一个产品,如果Nike公司需要发售相关的衣服的时候,工厂方法类就无能为力了。因此,为了让工厂类能够集成多种产品,又提出了抽象工厂模式。