工厂模式
工厂方法模式同样属于类的创建型模式,又被称为多态工厂模式。工厂方法的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
核心工厂类不在负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处就是使得工厂方法模式可以使系统不再修改具体工厂角色的情况下引进新的产品。
模式中包含的角色极其职责
抽象工厂角色
工厂方法的核心,任何工厂类都必须实现这个接口
具体工厂角色
具体工厂是抽象工厂的一个实现,负责实例化产品对象。
抽象角色
工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品
工厂方法模式所创建的具体实例对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5uoWJEma-1602171138325)(picture/image-2008225409185.png)]
工厂模式和简单工厂模式比较
工厂模式与简单工厂模式在结构上的不同不是很明显,工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体的类上。
工厂方法模式之所以有一个别名叫多态型工厂模式是因为具体工厂类都是共同的接口或者有共同的抽象父类。
当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了 - 开放封闭-原则。而简单工厂模式再添加新产品对象后不得不修改工厂方法,扩展性不好。工厂模式退化后可演变成简单工厂模式。
开放-封闭,通过添加代码的方式,不是通过修改代码的方式完成功能的增强
特点 :不需要修改源代码就可以实现新工能的添加 💛
源码实现:
#include <iostream>#include <string>using namespace std;// 抽象类中定义子类中需要实现的功能,也就是限定了子类必须实现的一些函数class Fruit{public:virtual void GetFruit(void) = 0;virtual ~Fruit(void){}};class Banana : public Fruit{public:virtual void GetFruit(void){cout << "I'm banana." << endl;}};class Apple : public Fruit{public:virtual void GetFruit(void){cout << "I'm apple." << endl;}};class AbstructFactory{public:virtual Fruit *CreateProduct(void) = 0;// 这里析构函数使用虚函数的原因是因为,只有父类中析构函数使用虚函数,// 多态时才会从子类析构函数一直调用到基类结束,否则只会调用父类的不会调用子类的析构函数virtual ~AbstructFactory(void){}};class BananaFactory : public AbstructFactory{public:virtual Fruit *CreateProduct(void){return new Banana;}};class AppleFactory : public AbstructFactory{public:virtual Fruit *CreateProduct(void){return new Apple;}};/*** 后期产品扩展*/class Peer : public Fruit{public:virtual void GetFruit(void){cout << "I'm peer." << endl;}};class PeerFactory : public AbstructFactory{public:virtual Fruit *CreateProduct(){return new Peer;}};int main(int argc, char const *argv[]){AbstructFactory *factory = NULL;Fruit *fruit = NULL;// 制造香蕉factory = new BananaFactory;fruit = factory->CreateProduct();fruit->GetFruit();delete fruit;delete factory;factory = new AppleFactory;fruit = factory->CreateProduct();fruit->GetFruit();delete fruit;delete factory;// 前期系统稳定之后,后期扩展cout << "extern" << endl;factory = new PeerFactory;fruit = factory->CreateProduct();fruit->GetFruit();delete fruit;delete factory;cout << "simple factory test" << endl;return 0;}
编译之后执行结果:
I'm banana.I'm apple.externI'm peer.simple factory test