在工厂方法模式中,我们提出让每个工厂都负责生产一种鞋子。为了扩展每个工厂的生产种类,以LiNing工厂为了,让该工厂在生产鞋子的同时还能够生产衣服。上述模式涉及到的类主要包括:抽象产品类、具体产品类、抽象工厂类以及具体工厂类。
1. 抽象产品类
在抽象产品类中主要包括鞋类和衣服两个抽象类:
class Clothes{
public:
Clothes(){};
virtual ~Clothes(){};
virtual void wear()=0;
};
class Shoes{
public:
Shoes(){};
virtual ~Shoes(){};
virtual void show() = 0;
};
2. 具体产品类
在具体产品类中,我们需要实例化上述两个抽象接口:
class NikeClothes: public Clothes{
public:
NikeClothes(){};
~NikeClothes(){};
void wear(){
cout << "这是nikeClothes类" << endl;
}
};
class NikeShoes: public Shoes{
public:
NikeShoes(){};
~NikeShoes(){};
void show(){
cout << "这是NikeShoes类" << endl;
}
};
3. 抽象工厂类
在抽象工厂类中,我们需要写出工厂类生产鞋子与生产衣服的方法:
class Factory{
public:
Factory(){};
virtual ~Factory(){};
virtual Shoes* produceShoes() = 0;
virtual Clothes* produceClothes() = 0;
};
4. 具体工厂类
在具体工厂类中,我们需要具体得到哪种品牌的工厂,然后再分别生产鞋子与衣服:
class NikeFactory: public Factory{
public:
NikeFactory(){};
~NikeFactory(){};
NikeShoes* produceShoes(){
cout << "生产了一双鞋子" << endl;
return new NikeShoes();
}
NikeClothes* produceClothes(){
cout << "生产了一件衣服" << endl;
return new NikeClothes();
}
};
5. 主函数测试
在主函数中,我们需要对工厂进行实例化,然后再测试生产鞋子与生产衣服的方法是否正确。
int main(){
NikeFactory* factory = new NikeFactory();
factory->produceClothes()->wear();
factory->produceShoes()->show();
return 0;
}
下面就是具体的实验结果:
6. 小结
在抽象工厂类中,我们已经可以将某一中产品的生产集成在工厂中了,即使鞋子和衣服的类别发生变化时,也不必修改工厂类了。但是,抽象工厂类中依然存在不如,比如现在需要扩展生产线生成手机呢?我们依然需要修改工厂类,再添加一个生产线了。这样做非常麻烦,那么有没有一种方式,使得即使是增加了产线,依然不需要修改工厂类了呢?