随笔-174  评论-598  文章-0  trackbacks-0
作用:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。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 那谁 阅读(1759) 评论(8)  编辑 收藏 引用 所属分类: 设计模式

评论:
# re: 常见设计模式的解析和实现(C++)之一-Factory模式 2006-12-18 18:52 | mezilla
不错,
有一事不明,在函数
Product* ConcreateCreator::FactoryMethod()
{
return new ConcreateProduct();
}
new的这个ConcreateProduct对象,在何处delete啊?


  回复  更多评论
  
# re: 常见设计模式的解析和实现(C++)之一-Factory模式 2007-03-18 21:55 | 黄大仙
delete p;

在这delete 了  回复  更多评论
  
# re: 常见设计模式的解析和实现(C++)之一-Factory模式 2007-07-24 17:48 | yacc2007
运行结果如下:
construction of ConcreateCreator
construction of ConcreateProduct
an operation of product
destruction of ConcreateCreator
貌似new 的ConcreateProduct并没有delete掉  回复  更多评论
  
# re: 常见设计模式的解析和实现(C++)之一-Factory模式 2007-10-20 09:37 | 路过的
有泄露.....有抄袭的嫌疑...跟教材上超类似  回复  更多评论
  
# re: 常见设计模式的解析和实现(C++)之一-Factory模式 2009-03-03 16:19 | no
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;
}  回复  更多评论
  
# re: 常见设计模式的解析和实现(C++)之一-Factory模式 2009-03-17 10:48 | 星绽紫辉
代码是看懂了,但是这样做有什么好处还不能理解。工厂实例化之后,不错是实例化了Product对象,但是Product本生就是在工厂类里面的,和普通的声明为成员函数来使用似乎没区别。而且,实际使用的是工厂中的方法,而不是Product中的方法。。。com的类防火墙我知道,但是似乎这和com的类防火墙不一样,不解。。。  回复  更多评论
  
# re: 常见设计模式的解析和实现(C++)之一-Factory模式 2009-03-17 10:55 | 星绽紫辉
哦,这样做的好处就是:一个类在一个庞大的工程中用到了很多,然后在后期又频繁修改的情况下,只需要修改类本生就可以达到全部修改的目的,因为是由类厂创建的,如果要更换产品,直接更换类就可以了。不变的是所有类的使用都是通过类厂实现的。。。  回复  更多评论
  
# re: 常见设计模式的解析和实现(C++)之一-Factory模式[未登录] 2009-07-01 12:21 | canaan

没有具体的实用例子,没意思  回复  更多评论
  


标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]
.NET频道  博客园社区  闪存
网站导航: