一,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模式后面会介绍)

本文介绍了Factory模式的主要功能,包括定义创建对象的接口以封装对象创建过程,以及如何通过延迟子类的具体化工作来提高代码的内聚性和降低耦合度。同时,文章还详细解释了Factory模式如何解决实例化具体子类时遇到的问题,并提供了示例代码。

3197

被折叠的 条评论
为什么被折叠?



