一,Factory模式主要功能
1,定义创建对象的接口,封装了对象的创建
2,使得具体化类的工作延迟到了子类中
二,Factory模式能够解决的问题
1,为了提高内聚(Cohesion)和松耦合(Coupling),需要抽象出一些类的公共接口以形成抽象基类或者接口,通常可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的,实际中经常会出现很多子类继承自抽象基类的情况,这样大多时候可能会出现两个问题,第一,必须知道实际子类的名称(系统复杂后我们有可能记不住子类名称),第二,程序的扩展性和维护性变差
2,解决父类并不知道具体要实例化哪一个具体的子类的问题(如假设我们在类A中要使用到类B,B是一个抽象父类,在A中并不知道具体要实例化那一个B的子类,但是在类A的子类D中是可以知道的)
三,Factory模式结构示意图
1,对于问题1,通常是声明一个创建对象的接口,并封装了对象的创建过,结构图如下:
2,对于问题2(最能体现Factory模式的威力,延迟子类的实例化),结构图如下:
3,两个结构图的主要区别就在于第二个结构图中的Factory只是提供了对象创建的接口,其实现将放在Factory的子类ConcreteFactory中进
四,示例代码
Product.h文件:
#ifndef _PRODUCT_H_
#define _PRODUCT_H_
class Product
{
public:
virtual ~Product() = 0;
protected:
Product();
};
class ConcreteProduct:public Product
{
public:
~ConcreteProduct();
ConcreteProduct();
};
#endif
//~_PRODUCT_H_
Product.cpp文件:
#include "stdafx.h"
#include "Product.h"
#include <iostream>
using namespace std;
Product::Product()
{
}
Product::~Product()
{
}
ConcreteProduct::ConcreteProduct()
{
cout<<"ConcreteProduct...."<<endl;
}
ConcreteProduct::~ConcreteProduct()
{
}
Factory.h文件:
#ifndef _FACTORY_H_
#define _FACTORY_H_
class Product;
class Factory
{
public:
virtual ~Factory() = 0;
virtual Product* CreateProduct() = 0;
protected:
Factory();
};
class ConcreteFactory:public Factory
{
public:
~ConcreteFactory();
ConcreteFactory();
Product* CreateProduct();
};
#endif
//~_FACTORY_H_
Factory.cpp文件:
#include "stdafx.h"
#include "Factory.h"
#include "Product.h"
#include <iostream>
using namespace std;
Factory::Factory()
{
}
Factory::~Factory()
{
}
ConcreteFactory::ConcreteFactory()
{
cout<<"ConcreteFactory....."<<endl;
}
ConcreteFactory::~ConcreteFactory()
{
}
Product* ConcreteFactory::CreateProduct()
{
return new ConcreteProduct();
}
FactoryDemo.cpp文件:
// Factory.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Factory.h"
#include "Product.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
Factory* fac = new ConcreteFactory();
Product* p = fac->CreateProduct();
getchar();
return 0;
}
五,一些思考
1,如果为每一个具体的ConcreteProduct类的实例化提供一个函数体,则需要在系统中添加了一个方法来处理这个新建的ConcreteProduct,这样Factory的接口永远就不肯能封闭(Close)
a,可以通过创建一个Factory的子类来通过多态实现这一点,不过会付出新建一个类的代价
b,将具体Product类作为模板参数通过模板化来避免创建子类
2,Factory模式对于对象的创建给予开发人员提供了很好的实现策略,但是Factory模式仅仅局限于一类类(就是说Product是一类,有一个共同的基类),如果要为不同类的类提供一个对象创建的接口,那就要用AbstractFactory模式(AbstractFactory模式后面会介绍)