《设计模式08》-创建型小结_第1页
《设计模式08》-创建型小结_第2页
《设计模式08》-创建型小结_第3页
《设计模式08》-创建型小结_第4页
《设计模式08》-创建型小结_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、创建型设计模式小结v工厂模式(Factory Method Pattern)v简单工厂模式(Simple Factory Pattern)v原型模式(Prototype Pattern) v单件模式(Singleton Pattern)v构造器模式(Builder Pattern)v抽象工厂模式(Abstract Factory Pattern)1.工厂方法模式v动机和意图定义一个用于创建对象的接口,而让子类决定具体实例化哪些对象。即将产品类的实例化延迟到子类,这样,Client选择不同的工厂,将创建不同的对象或对象集。从而将Client与产品间在创建时的紧密耦合,变成Client与工厂间的耦

2、合,而且client与其交互时,均通过统一接口。又名虚拟构造器(virtual Construtor)工厂方法示意图ClientFactory+CreateA()+CreateB()+CreateBwithParam()ProductAProductBA1A2A3B1B2Fac1Fac2Fac3Fac4Fac5工厂方法实现class Factory public: Factory() virtual ProductA * CreateA() =0; virtual ProductB * CreateB() = 0; virtual ProductB * CreateBwithParam(Par

3、am& para) = 0;;class Fac1:public Factory Public: Fac1() virtual ProductA * CreateA() return new A1; virtual ProductB * CreateB() return new B1; virtual ProductB * CreateBwithParam(Param& para) return new B2(para); ;工厂方法实现(参数化工厂方法)class MyFactory:public Factory public: virtual Product * Creat

4、e(int id) if (id = MINE) return new A1; else if (id = YOURS) return B1; . else if (id = THEIRS) reutrn new C1; return NULL; ; 工厂方法实现(使用类模版)template class MyFactory:public Factory Public: virtual Product * Create( ) return new Product; ; class OtherProduct:public Product /* 略略 */ ;MyFactory myFactory

5、;工厂方法优点和不足v优点1.分离了client与Product间在创建时的紧密耦合2.在接口不变的情况下,扩展产品子类容易3.在接口不变的情况下,变更产品类的组合容易v不足1.工厂类的子类数量增长较快2.增加新的 产品树不方便-通常需改变接口工厂方法的适用情况v作为基本创建型模式使用,首先考虑。v产品树稳定,但需要扩展子类产品v多个产品树中的产品组合不会以爆炸方法增加(这会导致具体工厂子类数量的增加)v需要将客户与具体产品的创建解耦的:1.如,当前不能确定具体创建哪些类型的产品的2.如,决定由子类指定创建的具体产品对象和方法的2.简单工厂方法(静态工厂方法)意图和动机 简化或退化的工厂方法模

6、式。课程英语软件工程学生+Sduty()Factory+Create课程(int id)课程 * Factory:Create课程(int id ) if( id = 1) return new 英语();else if (id = 2) return new 软件工程();else return null;void 学生:Study( ) Factory * fac = new Factory( ); 课程 * c1 = fac-Crete课程(1); 课程 * c2 = fac-Crete课程(2); .简单工厂方法-实现将全部工厂方法整合到产品类中将全部工厂方法整合到产品类中课程+Cre

7、ate课程(int id)英语软件工程学生+Sduty()课程 * 课程:Create课程(int id ) if( id = 1) return new 英语();else if (id = 2) return new 软件工程();else return null;void 学生:Study( ) 课程 * c1 = 课程:Crete课程(1); 课程 * c2 = 课程:Crete课程(2); .3.原形方法模式意图和目标让每个产品类实现公共的clone接口,以便client可以通过统一的clone方法,以原型实例为样本,创建“同样”的产品对象。原型方法-实现说明:1.客户-原型管理器-

8、产品2.可使用单件模式3.可使用工厂方法class ProtypeManager public: ProtypeManager(ProductA * p1, ProductB * p2, ProductC * p3) pa = p1; pb = p2; pc = p3; ProductA * CreateA() const return pa-Clone(); ProductB * CreateB() const return pb-Clone(); ProductA * CreateC() const return pc-Clone(); private: ProductA * pa; Pr

9、oductB * pb; ProductC * pc;原型方法-实现(工厂方法) class ProtypeFactory public: ProtypeFactory(ProductA * p1, ProductB * p2, ProductC * p3) pa = p1; pb = p2; pc = p3; virtual ProductA * CreateA() const return pa-Clone(); virtual ProductB * CreateB() const return pb-Clone(); virtual ProductC * CreateC(Param&am

10、p; para) const ProductC * p = pc-Clone(); p-Process(para); return p; private: ProductA * pa; ProductB * pb; ProductC * pc;原型方法-实现(简单工厂)Class ProtypeFactory public: static Product * GetProduct(int index) if(isLoaed = false) Load(); if (index=0 & indexClone(); else return NULL; static void ChangeP

11、roduct(int index,Product * newPruduct) psindex = newProduct; Private: static void Load( ) if (ps0 = NULL) ps0= new ProductA; else if (ps1 = NULL ) ps1 = new ProductB; else if (ps2= NULL) ps2 = new ProductC; static bool isLoaded; static Product * ps3;原型方法-优点和不足v优点1.增加新的子类产品容易2.在原型管理器中可动态增加、删除产品3.在原型管

12、理器中可动态修改产品对象4.在原型管理器中可动态地加载产品类5.通过override产品类的clone方法,改变产品的组织结构v不足1.实现产品的clone方法,有时是不易的,甚至有时是不可能的;2.创建产品必须通过已创建对象原型方法-适用情况v产品的clone方法,较易实现深拷贝v相同类型的产品对象,比较”相似”,不需要做复杂的修改v需要产品对象的数量较多v使用的产品类数量不会剧烈增加v需要动态加载产品类,或者动态增删、修改产品对象 4.单件模式v意图和动机通过设计,限制用户创建过多的实例(如1或N个),同时给Client一个全局的访问点.v要点单件类负责创建和管理本类对象单件模式-实现(1

13、个)class Singleton public: static Singleton * Instance( ); virtual void SomeFunc();protected: Singleton() private: /无实现 Singleton(const Singleton&); Singleton& operator=(const Singleton&); private: static Singleton * instance; int data;Singleton * Singleton:Instance( ) if ( instance = 0)

14、instance = new instance; return instance;单件模式-实现(多例-如线程池)class Threadpublic: static Thread * Instance() if (threads0 = NULL ) Init(); for(int i=0;iIsIdle() return threadsi; return NULL; virtual void SomeFunc();protected: Thread() static void Init() for(int i=0;iBuildPart( );生成器模式-实现Class MallDirecto

15、r Public: virtual Mall * CreateMall(MallBuilder& builder) builder.BuildMall(); builder.BuildPark(); builder.BuildPark(); builder.BuildFloor(1); builder.BuildFloor(2); builder.BuildFloor(3); builder.BuildFloor(4); return build.GetMall(); ;Class MallBuilder Public: Mall * GetMall() return mall; vi

16、rtual Mall * BuildMall(); virtual Floor * BuildFloor(int index); virtual Park * BuildPark(); virtual Room * BuildRoom( );Protected: Mall * mall;生成器模式-实现-(退化,director移入到builder)class MallBuilder public: virtual Mall * CreateMall(MallBuilder& builder) builder.BuildMall(); builder.BuildPark(); buil

17、der.BuildPark(); builder.BuildFloor(1); builder.BuildFloor(2); builder.BuildFloor(3); builder.BuildFloor(4); return build.GetMall(); Mall * GetMall() return mall; virtual Mall * BuildMall(); virtual Floor * BuildFloor(int index); virtual Park * BuildPark(); virtual Room * BuildRoom( );protected: Mal

18、l * mall;生成器模式优点和不足v优点1.分离了复杂产品的构建与表示2.构建(装配)方式、零件的构建均可独立变化3.构建的过程可通过子类扩展生成器模式适用情况v构建复杂对象,复杂对象可有多个复杂的零件,各零件可以由多个产品对象组成。v需要多种构建装配方式存在v需要向client隐藏构建细节和过程6.抽象工厂方法模式v意图和动机通过定义一些高层的抽象接口,而让子类决定具体创建的产品和过程,来解耦client与创建产品间的紧密耦合。是工厂方法的进一步推广。工厂方法的基类,可以是具体类。抽象工厂方法的基类,一定是抽象类。又名Kit(工具箱)工厂方法ClientFactory+CreateA()+CreateB()+CreateBwithParam()ProductAProductBA1A2A3B1B2Fac1Fac2Fac3Fac4Fac5产品树产品树(系列系列)间无明显关系间无明显关系产品树关系课程英语软件工程基础英语专业英语教师英语教师专业英语教师专业课教师公外教师产品族v课程-教师v英语-英语教

温馨提示

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

评论

0/150

提交评论