简单工厂模式的弊端
简单工厂模式虽然简单,但是违反了设计模式中的开放封闭原则
,即工厂类在数据增加时需要被修改,而我们在设计时对于已经设计好的类需要避免修改的操作,而选用扩展的方式。
工厂模式设计
简单工厂模式只有一个工厂类,而工厂模式是有一个基类,多个子类,基类中包含一个虚工厂函数,多个子类重写父类的工厂函数。每个子工厂类负责生产一种类,这相当于再次解耦,将工厂类再次拆分细化。
代码实例
#include <iostream>
using namespace std;//创建父类
class AbstructSmile
{
public:virtual void transform() = 0;virtual void ability() = 0;virtual ~AbstructSmile() {} //提供虚析构函数,为了能够释放子类对象
};class sheepSmile : public AbstructSmile
{
public:void transform() override{cout << "山羊恶魔果实" << endl;}void ability() override{cout << "山羊能力" << endl;}
};class lionSmile : public AbstructSmile
{
public:void transform() override{cout << "狮子恶魔果实" << endl;}void ability() override{cout << "狮子能力" << endl;}
};class batSmile : public AbstructSmile
{
public:void transform() override{cout << "蝙蝠恶魔果实" << endl;}void ability() override{cout << "蝙蝠能力" << endl;}
};
enum class Type :char {SHEEP,LION,BAT};
//创建工厂类--->基类
class smileFactory
{
public:virtual ~smileFactory() {}virtual AbstructSmile* creatsmile() = 0;
};class sheepFactory : public smileFactory
{
public:AbstructSmile* creatsmile() override{return new sheepSmile;} ~sheepFactory() {cout << "sheepFactory 被析构了" << endl;}
};class lionFactory : public smileFactory
{
public:AbstructSmile* creatsmile() override{return new lionSmile;}~lionFactory(){cout << "lionFactory 被析构了" << endl;}
};class batFactory : public smileFactory
{
public:AbstructSmile* creatsmile() override{return new batSmile;}~batFactory(){cout << "batFactory 被析构了" << endl;}
};
int main()
{smileFactory* sheepPtr = new sheepFactory; AbstructSmile* sheepObj = (AbstructSmile*)(sheepPtr->creatsmile());sheepObj->transform();sheepObj->ability();smileFactory* lionPtr = new lionFactory;AbstructSmile* lionObj = (AbstructSmile*)(lionPtr->creatsmile());lionObj->transform();lionObj->ability();smileFactory* batPtr = new batFactory;AbstructSmile* batObj = (AbstructSmile*)(batPtr->creatsmile());batObj->transform();batObj->ability();delete sheepObj;delete sheepPtr;delete lionObj;delete lionPtr;delete batObj;delete batPtr;return 0;
}
抽象类
抽象类不能直接构造对象,因为他是一种抽象的概念,没有具体的实现,如果想对象一个对象,需要创建一个继承自抽象类的具体类,并在该类中实现所有的纯虚函数,然后可以构造该具体类。