《设计模式08》-创建型小结

上传人:s9****2 文档编号:569712727 上传时间:2024-07-30 格式:PPT 页数:36 大小:297.50KB
返回 下载 相关 举报
《设计模式08》-创建型小结_第1页
第1页 / 共36页
《设计模式08》-创建型小结_第2页
第2页 / 共36页
《设计模式08》-创建型小结_第3页
第3页 / 共36页
《设计模式08》-创建型小结_第4页
第4页 / 共36页
《设计模式08》-创建型小结_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《《设计模式08》-创建型小结》由会员分享,可在线阅读,更多相关《《设计模式08》-创建型小结(36页珍藏版)》请在金锄头文库上搜索。

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)工厂方法示意图工厂方法实现class Factory public: Factory() virtual ProductA * CreateA() =0; virtual ProductB * CreateB() = 0; virtual ProductB * CreateBwithParam(Param& para) = 0;;class Fac1:public Factory Public: Fac1() virtual ProductA * CreateA() return new A1

3、; virtual ProductB * CreateB() return new B1; virtual ProductB * CreateBwithParam(Param& para) return new B2(para); ;工厂方法实现(参数化工厂方法)class MyFactory:public Factory public: virtual Product * Create(int id) if (id = MINE) return new A1; else if (id = YOURS) return B1; . else if (id = THEIRS) reutrn new

4、 C1; return NULL; ; 工厂方法实现(使用类模版)template class MyFactory:public Factory Public: virtual Product * Create( ) return new Product; ; class OtherProduct:public Product /* 略略 */ ;MyFactory myFactory;工厂方法优点和不足v优点1.分离了client与Product间在创建时的紧密耦合2.在接口不变的情况下,扩展产品子类容易3.在接口不变的情况下,变更产品类的组合容易v不足1.工厂类的子类数量增长较快2.增加新

5、的 产品树不方便-通常需改变接口工厂方法的适用情况v作为基本创建型模式使用,首先考虑。v产品树稳定,但需要扩展子类产品v多个产品树中的产品组合不会以爆炸方法增加(这会导致具体工厂子类数量的增加)v需要将客户与具体产品的创建解耦的:1.如,当前不能确定具体创建哪些类型的产品的2.如,决定由子类指定创建的具体产品对象和方法的2.简单工厂方法(静态工厂方法)意图和动机 简化或退化的工厂方法模式。简单工厂方法-实现将全部工厂方法整合到产品类中将全部工厂方法整合到产品类中3.原形方法模式意图和目标让每个产品类实现公共的clone接口,以便client可以通过统一的clone方法,以原型实例为样本,创建“

6、同样”的产品对象。原型方法-实现说明:1.客户-原型管理器-产品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

7、(); private: ProductA * pa; ProductB * 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(); virtu

8、al ProductC * CreateC(Param& 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 NUL

9、L; static void ChangeProduct(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.在

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

11、件类负责创建和管理本类对象单件模式-实现(1个)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 ( inst

12、ance = 0) 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;i10;i+) threadsi = new Thread

13、; ThreadPool( ThreadPool &); / 无实现无实现 ThreadPool& opeartor=(ThreadPool&);/无实现无实现 private: static Thread * threads10; /这里用数组实现,也可使用其它这里用数组实现,也可使用其它”注册器注册器”;单件模式-优点和不足v优点1.限制实例数量2.减少全局变量和全局函数的使用3.允许在子类中,扩展实现细节4.比全部使用类方法更灵活v不足1.静态方法Instance(),不支持多态。(变通之法-将具体要实例化类的类型信息,独立出来,如放到其它XML文件中)单件模式-适用情况v限定实例化数量

14、v该类需要子类型化进行扩展5.生成器模式v动机和意图将创建复杂对象的过程、算法、结构等独立出来,这样可以:1.同样的构建过程,使用不同的“零件”,可以创建不同”内芯”的复杂对象2.通过子类扩展,可以构建同样“零件”,但完全不同表现的复杂对象。如用同一副七巧板,摆出不同的图案。3.其中2中部分,可参考结构型模式和行为型模式生成器模式-实现Class MallDirector Public: virtual Mall * CreateMall(MallBuilder& builder) builder.BuildMall(); builder.BuildPark(); builder.BuildP

15、ark(); builder.BuildFloor(1); builder.BuildFloor(2); builder.BuildFloor(3); builder.BuildFloor(4); return build.GetMall(); ;Class MallBuilder Public: Mall * GetMall() return mall; virtual Mall * BuildMall(); virtual Floor * BuildFloor(int index); virtual Park * BuildPark(); virtual Room * BuildRoom(

16、 );Protected: Mall * mall;生成器模式-实现-(退化,director移入到builder)class MallBuilder 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.

17、GetMall(); Mall * GetMall() return mall; virtual Mall * BuildMall(); virtual Floor * BuildFloor(int index); virtual Park * BuildPark(); virtual Room * BuildRoom( );protected: Mall * mall;生成器模式优点和不足v优点1.分离了复杂产品的构建与表示2.构建(装配)方式、零件的构建均可独立变化3.构建的过程可通过子类扩展生成器模式适用情况v构建复杂对象,复杂对象可有多个复杂的零件,各零件可以由多个产品对象组成。v需要

18、多种构建装配方式存在v需要向client隐藏构建细节和过程6.抽象工厂方法模式v意图和动机通过定义一些高层的抽象接口,而让子类决定具体创建的产品和过程,来解耦client与创建产品间的紧密耦合。是工厂方法的进一步推广。工厂方法的基类,可以是具体类。抽象工厂方法的基类,一定是抽象类。又名Kit(工具箱)工厂方法产品树产品树(系列系列)间无明显关系间无明显关系产品树关系产品族v课程-教师v英语-英语教师v基础英语-公外教师v专业英语-专业英语教师v软件工程-专业课教师v特点:两个产品树是同构的。同一产品族必须一起创建和消费,不得跨族。抽象工厂的优点和不足v优点1.(同工厂方法)分离了client与Product间在创建时的紧密耦合2.(同工厂方法)在接口不变的情况下,扩展产品子类容易3.可以限制Client跨产品族消费v不足1.增加新的 产品树(系列)不方便-通常需改变接口2.产品树必须是同构的抽象工厂模式适用情况v同工厂方法v不同的产品树是同构的,相同位置的产品构成一个产品族。v限制client只能在某个产品族中消费,不得跨族消费v系统需要动态配置产品,但只能在一个产品族中创建并消费全部或部分产品

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号