简单工厂模式 定义:简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
1.工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
2.抽象(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3.具体产品(Concrete Product)角色
简单工厂模式所创建的具体实例对象
#include <iostream> using namespace std; class Fruit { private: protected: public: //纯虚函数 virtual void getFruit() = 0; }; class Pear:public Fruit { private: protected: public: void getFruit() { cout << "Pear fruit" << endl; } }; class Banana :public Fruit { private: protected: public: void getFruit() { cout << "Banana fruit" << endl; } }; //简单工厂 class Factory { private: protected: public: //构成依赖关系 static Fruit * create(const char * name) { if (strcmp(name, "Pear") == 0) { return new Pear; } else if(strcmp(name,"Banana") == 0) { return new Banana; } else { return NULL; } } }; int main() { Factory * factory = NULL; Fruit * fruit = NULL; factory = new Factory; //创建梨子 fruit = factory->create("Pear"); fruit->getFruit();//父类指针指向子类对象 delete fruit; //创建香蕉 fruit = factory->create("Banana"); fruit->getFruit();//父类指针指向子类对象 delete fruit; system("pause"); }简单工厂的优缺点: 在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。
下面可以有抽象工厂
#include <iostream> using namespace std; //抽象的水果类Fruit //抽象的工厂类FruitFactory //具体的工厂类,BananaFactory / PearFactory //具体的水果类,Banana / Pear //抽象水果类 class Fruit { private: protected: public: //纯虚函数 virtual void sayname() = 0; }; //抽象工厂类 class FruitFactory { private: protected: public: virtual Fruit * getFruit() = 0; }; //具体的水果类1 class Pear:public Fruit { private: protected: public: void sayname() { cout << "l'm Pear" << endl; } }; //具体的水果类2 class Banana :public Fruit { private: protected: public: void sayname() { cout << "l'm Banana" << endl; } }; class PearFactory:public FruitFactory { private: protected: public: Fruit * getFruit() { return new Pear; } }; class BananaFactory :public FruitFactory { private: protected: public: Fruit * getFruit() { return new Banana; } }; int main() { FruitFactory * fruitfactory = NULL; Fruit * fruit = NULL; //生产香蕉 fruitfactory = new BananaFactory; fruit = fruitfactory->getFruit(); fruit->sayname(); delete fruit; delete fruitfactory; //生产梨子 fruitfactory = new PearFactory; fruit = fruitfactory->getFruit(); fruit->sayname(); delete fruit; delete fruitfactory; cout << "hello" << endl; system("pause"); } 抽象工厂(Creator)角色抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
具体工厂( Concrete Creator)角色具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
抽象(Product)角色抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色抽象模式所创建的具体实例对象
#include <iostream> using namespace std; class Fruit { public: //纯虚函数 virtual void sayName() = 0; }; //抽象工厂 和 一般的工厂模型 相比较的话;产品的细化 class FruitFactory { public: //纯虚函数 virtual Fruit * getBanana() = 0; // virtual Fruit * getApple() = 0; // virtual Fruit * getMg() = 0; }; //南方香蕉 class SouthBanana:public Fruit { public: void sayName() { cout << "South Banana" << endl; } }; //北方香蕉 class NorthBanana :public Fruit { public: void sayName() { cout << "North Banana" << endl; } }; //南方苹果 class SouthApple :public Fruit { public: void sayName() { cout << "South Apple" << endl; } }; //北方苹果 class NorthApple :public Fruit { public: void sayName() { cout << "North Apple" << endl; } }; //南方芒果 class SouthMg :public Fruit { public: void sayName() { cout << "South Mg" << endl; } }; //北方芒果 class NorthMg :public Fruit { public: void sayName() { cout << "North Mg" << endl; } }; //北方工厂 class NorthFactory:public FruitFactory { public: Fruit * getBanana() { return new NorthBanana; } Fruit * getApple() { return new NorthApple; } Fruit * getMg() { return new NorthMg; } }; //南方工厂 class SouthFactory :public FruitFactory { public: Fruit * getBanana() { return new SouthBanana; } Fruit * getApple() { return new SouthApple; } Fruit * getMg() { return new SouthMg; } }; int main() { FruitFactory * fruitfactory = NULL; Fruit * fruit1 = NULL; Fruit * fruit2 = NULL; Fruit * fruit3 = NULL; //南方工厂 fruitfactory = new SouthFactory; fruit1 = fruitfactory->getApple(); fruit1->sayName(); fruit2 = fruitfactory->getBanana(); fruit2->sayName(); fruit3 = fruitfactory->getMg(); fruit3->sayName(); //北方工厂 fruitfactory = new NorthFactory; fruit1 = fruitfactory->getApple(); fruit1->sayName(); fruit2 = fruitfactory->getBanana(); fruit2->sayName(); fruit3 = fruitfactory->getMg(); fruit3->sayName(); system("pause"); }