那谁的技术博客

感兴趣领域:高性能服务器编程,存储,算法,Linux内核
随笔 - 210, 文章 - 0, 评论 - 1183, 引用 - 0
数据加载中……

常见设计模式的解析和实现(C++)之一-Factory模式

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

UML结构图:

抽象基类:
1)Product:创建出来的对象的抽象基类.
2)Factory创建对象的工厂方法的抽象基类.

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

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

备注:
设计模式的演示图上把Factory类命名为Creator,下面的实现沿用了这个命名.

演示实现:

1)Factory.h
/********************************************************************
    created:    2006/06/30
    filename:     Factory.h
    author:        李创
                
http://www.cppblog.com/converse/

    purpose:    Factory模式的演示代码
********************************************************************
*/


#ifndef FACTORY_H
#define FACTORY_H

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();
}
;

#endif

2)Factory.cpp
/********************************************************************
    created:    2006/06/30
    filename:     Factory.cpp
    author:        李创
                
http://www.cppblog.com/converse/

    purpose:    Factory模式的演示代码
********************************************************************
*/

#include 
"Factory.h"
#include 
<iostream>

using namespace std;

ConcreateProduct::ConcreateProduct()
{
    std::cout 
<< "construction of ConcreateProduct\n";
}


ConcreateProduct::
~ConcreateProduct()
{
    std::cout 
<< "destruction of ConcreateProduct\n";
}


void Creator::AnOperation()
{
    Product
* p = FactoryMethod();

    std::cout 
<< "an operation of product\n";
}


ConcreateCreator::ConcreateCreator()
{
    std::cout 
<< "construction of ConcreateCreator\n";
}


ConcreateCreator::
~ConcreateCreator()
{
    std::cout 
<< "destruction of ConcreateCreator\n";
}


Product
* ConcreateCreator::FactoryMethod()
{
    
return new ConcreateProduct();
}


3)Main.cpp(测试代码)
/********************************************************************
    created:    2006/06/30
    filename:     Main.cpp
    author:        李创
                
http://www.cppblog.com/converse/

    purpose:    测试Factory模式的代码
********************************************************************
*/


#include 
"Factory.h"
#include 
<stdlib.h>

int main(int argc,char* argv[])
{
    Creator 
*= new ConcreateCreator();
    p
->AnOperation();

    delete p;

    system(
"pause");

    
return 0;
}



posted on 2006-07-20 21:58 那谁 阅读(6770) 评论(8)  编辑 收藏 引用 所属分类: 设计模式

评论

# re: 常见设计模式的解析和实现(C++)之一-Factory模式  回复  更多评论   

不错,
有一事不明,在函数
Product* ConcreateCreator::FactoryMethod()
{
return new ConcreateProduct();
}
new的这个ConcreateProduct对象,在何处delete啊?


2006-12-18 18:52 | mezilla

# re: 常见设计模式的解析和实现(C++)之一-Factory模式  回复  更多评论   

delete p;

在这delete 了
2007-03-18 21:55 | 黄大仙

# re: 常见设计模式的解析和实现(C++)之一-Factory模式  回复  更多评论   

运行结果如下:
construction of ConcreateCreator
construction of ConcreateProduct
an operation of product
destruction of ConcreateCreator
貌似new 的ConcreateProduct并没有delete掉
2007-07-24 17:48 | yacc2007

# re: 常见设计模式的解析和实现(C++)之一-Factory模式  回复  更多评论   

有泄露.....有抄袭的嫌疑...跟教材上超类似
2007-10-20 09:37 | 路过的

# re: 常见设计模式的解析和实现(C++)之一-Factory模式  回复  更多评论   

void Creator::AnOperation()
{
Product* p = FactoryMethod();

std::cout << "an operation of product\n";
}

------》
void Creator::AnOperation()
{
Product* p = FactoryMethod();

std::cout << "an operation of product\n";
delete p;
}
2009-03-03 16:19 | no

# re: 常见设计模式的解析和实现(C++)之一-Factory模式  回复  更多评论   

代码是看懂了,但是这样做有什么好处还不能理解。工厂实例化之后,不错是实例化了Product对象,但是Product本生就是在工厂类里面的,和普通的声明为成员函数来使用似乎没区别。而且,实际使用的是工厂中的方法,而不是Product中的方法。。。com的类防火墙我知道,但是似乎这和com的类防火墙不一样,不解。。。
2009-03-17 10:48 | 星绽紫辉

# re: 常见设计模式的解析和实现(C++)之一-Factory模式  回复  更多评论   

哦,这样做的好处就是:一个类在一个庞大的工程中用到了很多,然后在后期又频繁修改的情况下,只需要修改类本生就可以达到全部修改的目的,因为是由类厂创建的,如果要更换产品,直接更换类就可以了。不变的是所有类的使用都是通过类厂实现的。。。
2009-03-17 10:55 | 星绽紫辉

# re: 常见设计模式的解析和实现(C++)之一-Factory模式[未登录]  回复  更多评论   


没有具体的实用例子,没意思
2009-07-01 12:21 | canaan

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理