c设计模式抽象工厂_第1页
c设计模式抽象工厂_第2页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+设计模式抽象工厂定义提供一个创建一系列相关或相互依赖对象的接口,而无需指 定它们具体的类。结构理解1.AbstraCtFaCtory是抽象工厂类,声明创建产品族的 接口。具体工厂创建具体的产品族(ProduCtFamily),可以创建出分属于不同产品等级的一个产品族中的 所有对象。ConCreteFaCtory1和ConCreteFaCtory2分别生产2个不同产品族。举例: 手机工厂生产的产品族中, 产品有Linux系统的手机 和Windows系统的手机。PC工厂生产的产品族中,产品有Linux系统的PC和Windows系统的PC。2.AbstraCtProduCtA和AbstraCtP

2、roduCtB是产品基类。它们的派生类是同产品等级结构 (产品类型) 的具的体产品。举例:Linux的具体产品类型包括Linux手机版和Linux PC版,Windows的具体产品类型包括Windows手机版和WindowsPC版。产品族和产品等级的关系: 从上图可以看出,4个具体工厂, 每个产品族有3个不同类型的产品,可以生产具体产品4*3=12中具体产品。 而对于工厂方法模式, 生产12中产品, 需要有12个工厂。3.调用者(Client)只能看到抽象层次接口。要点1.抽象工厂应用场景:一个系统要独立于它的产品的创建、组合和表示时。 一个系统要由多个产品系列中的一个来配置时。 当你要强调一

3、系列相关的产品对象的设计以便进行联合使 用时。当你提供一个产品类库,而只想显示它们的接口而不是实现 时。2.新增产品复杂。 抽象工厂增加产品组件时, 需要更 改所有工厂的接口。如增加产品ProductC,则工厂基类和具体工厂需要增加接口CreateProductC。3.抽象工厂模式与工厂方法模式的区别。a 重点不同。工厂方法模式强调的是不同的创建者根据自 身需求去生产不同的具体产品,重点是生产具体产品;而抽象工厂模式则定位为“在不指定实体类别的前提下,提供了 一个可以创建一系列相关或互相依赖之组件的接口” ,重点 是创建相关组件。b 抽象工厂提供了的“相关组件”可以看成是具体的产品(如Prod

4、uctA1),抽象工厂模式的“相关组件”可由工厂模 式实现。ConcreteFactory1.CreateProuductA()生产的具体产 品,可以用工厂方法模式实现,即每一个产品用一个工厂方 法实现。c 工厂方法模式只有一个抽象产品类,而抽象工厂模式有 多个。工厂方法模式的具体工厂类只能创建一个具体产品类 的实例,而抽象工厂模式可以创建多个。d 抽象工厂不能直接创建产品,只能创建工厂,即抽象工 厂创建的产品是工厂。虽然它也定义了创建产品的方法,但 需要创建出来的具体的工厂实现,即抽象工厂创建出的工厂 创建产品。e 工厂方法采用的是类继承机制(生成一个子类,重写该 工厂方法,在该方法中生产一

5、个对象) ;而抽象工厂采用的 是对象组合机制, 专门定义 “工厂” 对象来负责对象的创建。 对象组合的方式就是把“工厂”对象作为参数传递。应用 抽象工厂模式可应用:支持多种数据库的数据库接口访问层;界面设计各种风格界面等。源码中通过PC工厂和手机工厂和预装的操作系统产品来举 例实现模式。源码#include <iostream> #include <string> using namespacestd;/产品class CLinuxpublic:virtual CLinux() ; /产品使用公共接口virtual void Start(

6、) = 0;class CLinuxMobile : public CLinuxpublic:CLinuxMobile()cout << create linux mobile. << endl;virtual CLinuxMobile() ;virtual void Start()cout << linux mobile start. << endl;class CLinuxPC : public CLinuxpublic:CLinuxPC()cout <&l

7、t; create linux PC. << endl;virtual CLinuxPC() ; virtual void Start()cout << linux PC start. << endl;class CWindowspublic:virtual CWindows() ;/产品使用公共接口virtual void Start() = 0;class CWindowsMobile : public CWindowspublic:CWindowsMobile()cout <<

8、 create windows mobile. << endl;virtual CWindowsMobile() ;virtual void Start()cout << windows mobile start. << endl;class CWindowsPC : public CWindowspublic:;CWindowsPC()cout << create windows PC. << endl;virtual CWindowsPC() ;vir

9、tual void Start()cout << windows PC start. << endl;/工厂class CFactorypublic:virtual CFactory();/产品族有个产品组件virtual CLinux* CreateLinux() = 0;virtual CWindows* CreateWindows() = 0;class CMobileFactory : public CFactorypublic:CMobileFactory()cout << create mobile

10、 factory. << endl;virtual CMobileFactory();virtual CLinux* CreateLinux()return new CLinuxMobile;virtual CWindows* CreateWindows()return new CWindowsMobile;class CPCFactory : public CFactorypublic:CPCFactory()cout << create PC factory. << endl;virtual CPCFact

11、ory();virtual CLinux* CreateLinux()return new CLinuxPC;virtual CWindows* CreateWindows()return new CWindowsPC;void Test(CFactory* pFactory)CLinux* pLinux = NULL;CWindows* pWindows = NULL;pLinux = pFactory->CreateLinux();pWindows = pFactory->CreateWindows();pLinux->Start();pWindo

12、ws->Start();delete pWindows;delete pLinux;int main()CFactory* pFactory = NULL;/手机工厂。 生产手机产品族, 种类有Linux和WindowspFactory = new CMobileFactory;Test(pFactory);delete pFactory;cout << endl;/PC工厂。生产PC产品族,种类有Linux和WindowspFactory= new CPCFactory;Test(pFactory); delete pFactory;system(pause); return 0;输出:crea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论