设计模式之Factory模式

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值