[设计模式]Factory工厂模式
Factory工厂模式
很多资料也称FactoryMothed(工厂方法)主要用于创建对象。新添加类时,不会影响以前的系统代码。核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。
解析
1)Product:创建出来的对象的抽象基类2)Factory:创建对象的工厂方法的抽象基类3)Factory::CreateProduct():纯虚函数,由派生类实现,创建出对应的Product在这个模式中,抽象基类Product和Factory在相互协作的时候都是都是有相应的Factory派生类来生产Product的派生类,也就是说如果要新增一种Product的派生类那么也要对应的新增一个Factory派生类,创建的过程委托给了这个Factory。也就是说一个Factory派生类和一个Produc派生类是一一对应的关系。
Factory模式的应用并不只是为了封装对象的创建,而是要把对象的创建放到子类中实现:Factory中只是提供了对象创建的接口,其实现将放在Factory的子类ConcreteFactory中进行。
小demo
factory.h
#ifndef FACTORY_H#define FACTORY_H#include <iostream>using namespace std;class Product{public:Product(){cout << "construction of Product\n";}virtual ~Product(){cout << "destruction of Product\n";}};class ConcreteProduct1 : public Product{public:ConcreteProduct1(){cout << "construction of ConcreteProduct1\n";}virtual ~ConcreteProduct1(){cout << "destruction of ConcreteProduct1\n";}};class ConcreteProduct2 : public Product{public:ConcreteProduct2(){cout << "construction of ConcreteProduct2\n";}virtual ~ConcreteProduct2(){cout << "destruction of ConcreteProduct2\n";}};class Factory{public:Factory(){cout << "construction of Factory\n";}virtual ~Factory(){cout << "destruction of Factory\n";}public:virtual Product* FactoryMethod()=0; };class ConcreteFactory1 : public Factory{public:ConcreteFactory1(){cout << "construction of ConcreteFactory1\n";}virtual ~ConcreteFactory1(){cout << "destruction of ConcreteFactory1\n";}public:virtual Product* FactoryMethod(){return new ConcreteProduct1();} }; class ConcreteFactory2 : public Factory{public:ConcreteFactory2(){cout << "construction of ConcreteFactory2\n";}virtual ~ConcreteFactory2(){cout << "destruction of ConcreteFactory2\n";}public:virtual Product* FactoryMethod(){return new ConcreteProduct2();} }; #endif
main.h
#include "Factory.h"#include <stdlib.h>int main(int argc,char* argv[]){ //创建产品1Factory* fac=new ConcreteFactory1(); Product* pro1=fac->FactoryMethod();//创建产品2fac=new ConcreteFactory2(); Product* pro2=fac->FactoryMethod();delete pro2;delete pro1;delete fac;system("pause");return 0;}
输出结果
Factory模式带来的问题:如果为每个具体的ConcreteProduct类的实例化提供一个函数体,那么我们可能不得不在系统中添加一个方法来处理这个新建的ConcreteProduct,这样Factory的接口永远就不可能封闭。当然我们可以通过创建一个Factory的子类来通过多态实现这一点,但是这也是以新建一个类作为代价的。 而且客户端必须知道基类和工厂类,耦合性差
Factory模式对于对象的创建给予开发人员提供了很好的实现策略,但是Factory模式仅仅局限于一类类(也就是说Product是一类,有一个共同的基类),如果我们要为不同类的类提供一个对象创建的接口,那就要用AbstractFactory了。