|
阅读:752回复:2
设计模式R&D1_Abstract Factory抽象工厂(原创)
/*
初写文章,水平有限,只是想抛个砖,以引起大家的热情,如果有人可从中获得一点点收获,或是告知我思想认识上的错误与不足。让我有所收获。那我就很: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); */ |
|
|
|
1C#
发布于: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 修改 ] |
|
|
2C#
发布于: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; } |
|
|