janvy

编程是一门技术,更是一门艺术!!!
posts - 12, comments - 1, trackbacks - 0, articles - 0

Factory模式

Posted on 2010-03-28 09:54 janvy 阅读(679) 评论(0)  编辑 收藏 引用 所属分类: 设计模式

作用: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

抽象基类 1Product:创建出来的对象的抽象基类。

            2FactoryCreator):创建对象的工厂方法的抽象基类。

接口函数: 1Creator::FactoryMethod:纯虚函数,由派生类实现,创建出对应的Product

解析: 在这个模式中,有两个抽象基类,一个是Product为创建出来的对象的抽象基类,一个是Factory是工厂的抽象基类,在互相协作的时候都是由相应的Factory派生类来生成Product的派生类,也就是说如果要新增一种Product那么也要对应的新增一个Factory,创建的过程委托给了这个Factory。也就是说一个Factory和一个Product是一一对应关系。

备注: Factory Creator     

Factory模式带来至少以下两个问题:

(1)    如果为每一个具体的ConcreteProduct类的实例化提供一个函数体,那么我们可能不得不在系统中添加了一个方法来处理这个新建的ConcreteProduct,这样Factory的接口永远就不肯封闭(Close)。当然我们可以通过创建一个Factory的子类来通过多态实现这一点,但是这也是以新建一个类作为代价的。

(2)    在实现中我们可以通过参数化工厂方法,即给FactoryMethod()传递一个参数用以决定是创建具体哪一个具体的Product

可以看出,Factory模式对于对象的创建给予开发人员提供了很好的实现策略,但是Factory模式仅仅局限于一类类(就是说Product是一类,有一个共同的基类),如果我们要为不同类的类提供一个对象创建的接口,那就要用AbstractFactory了。

 

 

 

代码演示:

********************************************

Factory.h     janvyking999

********************************************

class Product {

public:

    Product() {}

    virtual ~Product() {}

};

class ConcreateProduct:public Product {

public:

    ConcreateProduct();

    virtual ~ConcreateProduct();

};

class Creator {

public:

    Creator() {}

    virtual ~Creator() {}

    void anOperation();

protected:

    virtual Product* FactoryMethod() = 0;

};

class ConcreateCreator:public Creator {

public:

    ConcreateCreator();

    virtual ~ConcreateCreator();

protected:

    virtual Product* FactoryMethod();

};

*******************************************

Factory.cpp     janvyking999

******************************************

#include <iostream>

#include "Factory.h"

using namespace std;

ConcreateProduct::ConcreateProduct() {

    cout<<"construction of ConcreateProduct"<<endl;

}

ConcreateProduct::~ConcreateProduct() {

    cout<<"destruction of ConcreateProduct"<<endl;

}

void Creator::anOperation() {

    Product* p = FactoryMethod();

    cout<<"an operation of product"<<endl;

}

ConcreateCreator::ConcreateCreator() {

    cout<<"construction of ConcreateCreator"<<endl;

}

ConcreateCreator::~ConcreateCreator() {

    cout<<"destruction of ConcreateCreator"<<endl;

}

Product* ConcreateCreator::FactoryMethod() {

    return new ConcreateProduct();

}

*******************************************

FactoryMain.cpp     janvyking999

*******************************************

#include <cstdlib>

#include "Factory.h"

int main() {

    Creator *p = new ConcreateCreator();

    p->anOperation();

    delete p;

    system("pause");

    return 0;

}

程序输出:

construction of ConcreateCreator

construction of ConcreateProduct

an operation of product

destruction of ConcreateCreator


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理