设计模式概要.ppt_第1页
设计模式概要.ppt_第2页
设计模式概要.ppt_第3页
设计模式概要.ppt_第4页
设计模式概要.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

设计模式 模式的作用 Gamma E Helm R Johnson R andVlissides DesignPatterns Reading MA AddisonWesley 1994 10 增加应用程序一致性减少测试时间减少维护工作 课本Page331 一个比喻 三十六计 设计模式 三大类别 生成性模式结构性模式行为性模式 工厂方法 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化 不必事先知道每次要实例化哪一个类 工厂模式有以下几种形态 简单工厂 SimpleFactory 模式工厂方法 FactoryMethod 模式抽象工厂 AbstractFactory 模式 一 简单工厂 SimpleFactory 模式 SimpleFactory模式根据提供给它的数据 返回几个可能类中的一个类的实例 通常它返回的类都有一个公共的父类和公共的方法 SimpleFactory模式实际上不是GoF23个设计模式中的一员 二 SimpleFactory模式角色与结构 工厂类角色Creator LightSimpleFactory 工厂类在客户端的直接控制下 Create方法 创建产品对象 抽象产品角色Product Light 定义简单工厂创建的对象的父类或它们共同拥有的接口 可以是一个类 抽象类或接口 具体产品角色ConcreteProduct BulbLight TubeLight 定义工厂具体加工出的对象 程序举例 SimpleFactory txt 优点与缺点 优点 工厂类含有必要的判断逻辑 可以决定在什么时候创建哪一个产品类的实例 客户端可以免除直接创建产品对象的责任 而仅仅 消费 产品 简单工厂模式通过这种做法实现了对责任的分割 缺点 当产品有复杂的多层等级结构时 工厂类只有自己 以不变应万变 就是模式的缺点 因为工厂类集中了所有产品创建逻辑 一旦不能正常工作 整个系统都要受到影响 同时 系统扩展困难 一旦添加新产品就不得不修改工厂逻辑 有可能造成工厂逻辑过于复杂 另外 简单工厂模式通常使用静态工厂方法 这使得无法由子类继承 造成工厂角色无法形成基于继承的等级结构 工厂方法 FactoryMethod 模式 工厂方法 FactoryMethod 模式是类的创建模式 其用意是定义一个创建产品对象的工厂接口 将实际创建工作推迟到子类中 工厂方法模式是简单工厂模式的进一步抽象和推广 由于使用了多态性 工厂方法模式保持了简单工厂模式的优点 而且克服了它的缺点 在工厂方法模式中 核心的工厂类不再负责所有产品的创建 而是将具体创建工作交给子类去做 这个核心类仅仅负责给出具体工厂必须实现的接口 而不接触哪一个产品类被实例化这种细节 这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品 在FactoryMethod模式中 工厂类与产品类往往具有平行的等级结构 它们之间一一对应 FactoryMethod模式角色与结构 抽象工厂 Creator 角色 是工厂方法模式的核心 与应用程序无关 任何在模式中创建的对象的工厂类必须实现这个接口 具体工厂 ConcreteCreator 角色 这是实现抽象工厂接口的具体工厂类 包含与应用程序密切相关的逻辑 并且受到应用程序调用以创建产品对象 在上图中有两个这样的角色 BulbCreator与TubeCreator 抽象产品 Product 角色 工厂方法模式所创建的对象的超类型 也就是产品对象的共同父类或共同拥有的接口 在上图中 这个角色是Light 具体产品 ConcreteProduct 角色 这个角色实现了抽象产品角色所定义的接口 顺序图 活动过程包括 客户端创建BulbCreator对象 客户端持有此对象的类型是Creator 而实际类型是BulbCreator 然后客户端调用BulbCreator的factory方法 之后BulbCreator调用BulbLight的构造函数创造出产品BulbLight对象 程序举例 ifndefFACTORY H defineFACTORY HclassProduct public Product virtual Product classConcreateProduct publicProduct public ConcreateProduct virtual ConcreateProduct classCreator public Creator virtual Creator voidAnOperation protected virtualProduct FactoryMethod 0 classConcreateCreator publicCreator public ConcreateCreator virtual ConcreateCreator protected virtualProduct FactoryMethod endif include Factory h includeusingnamespacestd ConcreateProduct ConcreateProduct std cout constructionofConcreateProduct n ConcreateProduct ConcreateProduct std cout destructionofConcreateProduct n voidCreator AnOperation Product p FactoryMethod std cout anoperationofproduct n ConcreateCreator ConcreateCreator std cout constructionofConcreateCreator n ConcreateCreator ConcreateCreator std cout destructionofConcreateCreator n Product ConcreateCreator FactoryMethod returnnewConcreateProduct include Factory h includeintmain intargc char argv Creator p newConcreateCreator p AnOperation deletep system pause return0 工厂方法模式与简单工厂模式 工厂方法模式与简单工厂模式再结构上的不同不是很明显 工厂方法类的核心是一个抽象工厂类 而简单工厂模式把核心放在一个具体类上 工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口 或者有共同的抽象父类 当系统扩展需要添加新的产品对象时 仅仅需要添加一个具体对象以及一个具体工厂对象 原有工厂对象不需要进行任何修改 也不需要修改客户端 很好的符合了 开放 封闭 原则 而简单工厂模式在添加新产品对象后不得不修改工厂方法 扩展性不好 工厂方法模式退化后可以演变成简单工厂模式 AbstractFactory 名称AbstractFactory结构意图提供一个创建一系列相关或相互依赖对象的接口 而无需指定它们具体的类 适用性一个系统要独立于它的产品的创建 组合和表示时 一个系统要由多个产品系列中的一个来配置时 当你要强调一系列相关的产品对象的设计以便进行联合使用时 当你提供一个产品类库 而只想显示它们的接口而不是实现时 AbstractFactory AbstractoryFactory ifndefABSTRACTFACTORY H defineABSTRACTFACTORY H 抽象基类AbstractProductA 代表产品A的抽象classAbstractProductA public AbstractProductA virtual AbstractProductA 派生类ConcreateProductA1 继承自AbstractProductA 代表产品A的第一种实现classConcreateProductA1 publicAbstractProductA public ConcreateProductA1 virtual ConcreateProductA1 派生类ConcreateProductA2 继承自AbstractProductA 代表产品A的第二种实现classConcreateProductA2 publicAbstractProductA public ConcreateProductA2 virtual ConcreateProductA2 抽象基类AbstractProductB 代表产品B的抽象classAbstractProductB public AbstractProductB virtual AbstractProductB 派生类ConcreateProductB1 继承自AbstractProductB 代表产品B的第一种实现classConcreateProductB1 publicAbstractProductB public ConcreateProductB1 virtual ConcreateProductB1 派生类ConcreateProductB2 继承自AbstractProductB 代表产品B的第二种实现classConcreateProductB2 publicAbstractProductB public ConcreateProductB2 virtual ConcreateProductB2 抽象基类AbstractFactory 工厂的抽象类 生产产品A和产品BclassAbstractFactory public AbstractFactory virtual AbstractFactory virtualAbstractProductA CreateProductA 0 virtualAbstractProductB CreateProductB 0 派生类ConcreateFactory1 继承自AbstractFactory 生产产品A和产品B的第一种实现classConcreateFactory1 publicAbstractFactory public ConcreateFactory1 virtual ConcreateFactory1 virtualAbstractProductA CreateProductA virtualAbstractProductB CreateProductB 派生类ConcreateFactory2 继承自AbstractFactory 生产产品A和产品B的第二种实现classConcreateFactory2 publicAbstractFactory public ConcreateFactory2 virtual ConcreateFactory2 virtualAbstractProductA CreateProductA virtualAbstractProductB CreateProductB endif include include AbstractFactory h ConcreateProductA1 ConcreateProductA1 std cout constructionofConcreateProductA1 n ConcreateProductA1 ConcreateProductA1 std cout destructionofConcreateProductA1 n ConcreateProductA2 ConcreateProductA2 std cout constructionofConcreateProductA2 n ConcreateProductA2 ConcreateProductA2 std cout destructionofConcreateProductA2 n ConcreateProductB1 ConcreateProductB1 std cout constructionofConcreateProductB1 n ConcreateProductB1 ConcreateProductB1 std cout destructionofConcreateProductB1 n ConcreateProductB2 ConcreateProductB2 std cout constructionofConcreateProductB2 n ConcreateProductB2 ConcreateProductB2 std cout destructionofConcreateProductB2 n ConcreateFactory1 ConcreateFactory1 std cout constructionofConcreateFactory1 n ConcreateFactory1 ConcreateFactory1 std cout destructionofConcreateFactory1 n AbstractProductA ConcreateFactory1 CreateProductA returnnewConcreateProductA1 AbstractProductB ConcreateFactory1 CreateProductB returnnewConcreateProductB1 ConcreateFactory2 ConcreateFactory2 std cout constructionofConcreateFactory2 n ConcreateFactory2 ConcreateFactory2 std cout destructionofConcreateFactory2 n AbstractProductA ConcreateFactory2 CreateProductA returnnewConcreateProductA2 AbstractProductB ConcreateFactory2 CreateProductB returnnewConcreateProductB2 include AbstractFactory h includeintmain 生产产品A的第一种实现ConcreateFactory1 pFactory1 newConcreateFactory1 AbstractProductA pProductA pFactory1 CreateProductA 生产产品B的第二种实现ConcreateFactory2 pFactory2 newConcreateFactory2 AbstractProductB pProductB pFactory2 CreateProductB deletepFactory1 deletepProductA deletepFactory2 deletepProductB system pause return0 Adaptor 名称Adapter结构意图将一个类的接口转换成客户希望的另外一个接口 Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 适用性你想使用一个已经存在的类 而它的接口不符合你的需求 你想创建一个可以复用的类 该类可以与其他不相关的类或不可预见的类 即那些接口可能不一定兼容的类 协同工作 仅适用于对象Adapter 你想使用一些已经存在的子类 但是不可能对每一个都进行子类化以匹配它们的接口 对象适配器可以适配它的父类接口 Adaptor ifndefADAPTER H defineADAPTER H 需要被Adapt的类classTarget public Target virtual Target virtualvoidRequest 0 与被Adapt对象提供不兼容接口的类classAdaptee public Adaptee Adaptee voidSpecialRequest 进行Adapt的类 采用聚合原有接口类的方式classAdapter publicTarget public Adapter Adaptee pAdaptee virtual Adapter virtualvoidRequest private Adaptee m pAdptee endif include Adapter h includevoidAdaptee SpecialRequest std coutSpecialRequest include Adapter h includeintmain Adaptee pAdaptee newAdaptee Target pTarget newAdapter pAdaptee pTarget Request deletepTarget system pause return0 Bridge 名称Bridge结构意图将抽象部分与它的实现部分分离 使它们都可以独立地变化 适用性你不希望在抽象和它的实现部分之间有一个固定的绑定关系 例如这种情况可能是因为 在程序运行时刻实现部分应可以被选择或者切换 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充 这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合 并分别对它们进行扩充 对一个抽象的实现部分的修改应对客户不产生影响 即客户的代码不必重新编译 Bridge ifndefBRIDEG H defineBRIDEG HclassImplementor 维护一个Implementor类的指针classAbstraction public Abstraction Implementor pImplementor virtual Abstraction voidOperation protected Implementor m pImplementor 为实现Abstraction定义的抽象基类 定义了实现的接口函数classImplementor public Implementor virtual Implementor virtualvoidOperationImpl 0 继承自Implementor 是Implementor的不同实现之一classConcreateImplementorA publicImplementor public ConcreateImplementorA virtual ConcreateImplementorA virtualvoidOperationImpl 继承自Implementor 是Implementor的不同实现之一classConcreateImplementorB publicImplementor public ConcreateImplementorB virtual ConcreateImplementorB virtualvoidOperationImpl endif include Brige h includevoidConcreateImplementorA OperationImpl std coutOperationImpl include Brige h include includeintmain ConcreateImplementorA pImplA newConcreateImplementorA Abstraction pAbstraction1 newAbstraction pImplA pAbstraction1 Operation ConcreateImplementorB pImplB newConcreateImplementorB Abstraction pAbstraction2 newAbstraction pImplB pAbstraction2 Operation deletepAbstraction1 deletepAbstraction2 system pause return0 Facade 名称Facade结构意图为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口 这个接口使得这一子系统更加容易使用 适用性当你要为一个复杂子系统提供一个简单接口时 子系统往往因为不断演化而变得越来越复杂 大多数模式使用时都会产生更多更小的类 这使得子系统更具可重用性 也更容易对子系统进行定制 但这也给那些不需要定制子系统的

温馨提示

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

评论

0/150

提交评论