dabou
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
阅读:753回复:2

设计模式R&D1_Abstract Factory抽象工厂(原创)

楼主#
更多 发布于:2002-08-20 14:48
/*
        初写文章,水平有限,只是想抛个砖,以引起大家的热情,如果有人可从中获得一点点收获,或是告知我思想认识上的错误与不足。让我有所收获。那我就很:icon_smile_approve::icon_smile_approve:了
*/
/*
意图:提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。

例如我们要生成一个复杂的人
现在我们手上有俩个系列的产品 boy & girl
脑袋: 男孩的脑袋(C_Boy_Head)
女孩的脑袋(C_Girl_Head)
身体: 男孩的身体(C_Boy_Head)
女孩的身体(C_Girl_Head)

现在客户要创建一个人 得这么来
Humen* Create_Humen()
{
Humen* pHumen = new Humen("Name");
pHumen->m_pHead = new C_Boy_Head;
pHumen->m_pBody = new C_Boy_Body;
//....
return pHumen;
}

 现在客户要创建一个女孩,又得改写代码
Humen* Create_Humen()
{
Humen* pHumen = new Humen("Name");
pHumen->m_pHead = new C_Girl_Head;
pHumen->m_pBody = new C_Girl_Body;
//....
return pHumen;
}
有了Abstract Factory就好多了,不同的具体工厂产生不同系列的产品。
先看以下例子
*/

// TestAFactory.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream.h"
#include "string.h"

/*
Abstract Factory  
A_   Abstract  
C_ Concrete
Author: zhangdabou
Modify date: 2002.8.20
*/

/*
抽象的产品   头部
*/
class Abstract_Head{
public:
virtual char* GetProduct() {return "a head ";}
};
/*
具体的产品   男孩头部
*/
class C_Boy_Head : public Abstract_Head{
public:
virtual char* GetProduct(){return "a Boy's head ";}
};
/*
具体的产品 女孩头部
*/
class C_Girl_Head : public Abstract_Head{
public:
virtual char* GetProduct(){return "a Girl's head ";}
};
/*
抽象的产品   身体
*/
class Abstract_Body{
public:
virtual char* GetProduct(){return "a body ";}
};
/*
具体的产品   男孩身体
*/
class C_Boy_Body : public Abstract_Body {
public:
virtual char* GetProduct(){return "a Boy's body ";}
};
/*
具体的产品 女孩身体
*/
class C_Girl_Body : public Abstract_Body {
public:
virtual char* GetProduct(){return "a Girl's body ";}
};
///////////////////////////////////////////////////
/*
创建抽象产品对象的 抽象工厂
*/
class A_Factory{
public:
virtual Abstract_Head* Create_Head() = 0;
virtual Abstract_Body* Create_Body() = 0;
};
/*
创建具体产品对象的 具体工厂 生产帅哥的各个部分
*/
class C_Boy_Factory : public A_Factory{
public:
virtual Abstract_Head* Create_Head(){return new C_Boy_Head();}
virtual Abstract_Body* Create_Body(){return new C_Boy_Body();}
};
/*
创建具体产品对象的 具体工厂 生产美女的各个部分
*/
class C_Girl_Factory : public A_Factory{
public:
virtual Abstract_Head* Create_Head(){return new C_Girl_Head();}
virtual Abstract_Body* Create_Body(){return new C_Girl_Body();}
};
/*
一个人产品
*/
class Humen{
private:
char* m_psz;
Abstract_Head* m_pHead;  //头
Abstract_Body* m_pBody; //身体

public:
Humen(char* pszName){
m_psz = new char[100];
strcpy(m_psz,pszName);
}
~Humen(){delete []m_psz;}
//给这个人一个脑袋
void Attach_Head(Abstract_Head* pHead){m_pHead = pHead;}
//给这个人一个身体
void Attach_Body(Abstract_Body* pBody){m_pBody = pBody;}
//...other part of the humen
//return this humen
char* GetThisHumen()
{
strcat(m_psz," has ");
strcat(m_psz,m_pHead->GetProduct());
strcat(m_psz," has ");
strcat(m_psz,m_pBody->GetProduct());
return m_psz;
}
};
/*
客户使用
*/
Humen* Create_Humen(A_Factory* pFactory)
{
Humen* pHumen = new Humen("ZhangDabou");

pHumen->Attach_Head(pFactory->Create_Head());
pHumen->Attach_Body(pFactory->Create_Body());
//创建各个部分
//....

return pHumen;
}

int main(int argc, char* argv[])
{
C_Boy_Factory factory; //男孩工厂

Humen* p = Create_Humen(&factory);
cout<<p->GetThisHumen();
return 0;
}
/*
 看,用了Abstract Factory就方便多了,客户只要知道C_Boy_Factory,C_Girl_Factroy(具体工厂)和
 Abstract_Head,Abstract_Body(抽象产品)即可,至于具体产品的创建
 细节客户不用关心
如果要创建一个女孩,只需改变工厂即可
C_Girl_Factory factory; //女孩工厂
Humen* p = Create_Humen(&factory);
*/
当个好的屠夫一直是我的梦想
dabou
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
1C#
发布于:2002-08-27 18:58
Re:设计模式R&D1_Abstract Factory抽象工厂(原创)
:supergrin:噢,泄露   不好意思,想问一下,哪泄露了
int main(int argc, char* argv[])
{
     C_Boy_Factory factory;

     Humen* p = Create_Humen(&factory);
     cout<<p->GetThisHumen();
     delete p;                    //是这吗?
    
     return 0;
}
当个好的屠夫一直是我的梦想
kmwang
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
2C#
发布于:2002-08-25 19:20
Re:设计模式R&D1_Abstract Factory抽象工厂(原创)
内存泄漏!看来还要造个火葬厂:supergrin:
书中关于Abstract Factory的例子并不好,好像还没你的好,设计软件要考虑的三大要素是时间,资金,质量,所以选择设计模式不仅是这种模式是否适合。例如,多视感和不同window系统的移植问题,如果选择了书中的例子可就苦了,例如,一个可以在Mac,windows,X下都可以设计的系统不会少于150kloc,需要约18-20人/年,所以不合算,而且编出来的界面四不象,还没法使用生成工具,我还没见过使用这种模式的商业软件。正如地方法规要符合中央法规,设计模式的选择要符合软件工程的需要,但是Maz游戏等例子很好 [ 2002-8-25 下午 07:22:38 kmwang 修改 ]
游客

返回顶部