设计模式的适用性和效果

来源:互联网 发布:怎样在淘宝申请小号 编辑:程序博客网 时间:2024/05/21 11:29

创建型模式
  1.abstrct factory 创建一系列相关对象的接口
 适用性:
   1系统要使用多个产品系列中的一个来配置时。例如:有多种不同的lookandfeel工具包, 就可以通过抽象工厂产生各种不同视觉的组件。
   2一个系统要独立于他的产品的创建,组合和表示时。即系统要和具体的产品无关时。
   3只想显示接口而不是实现时。即只想让客户端知道抽象产品而不是具体产品。
   4当要使用某一系列的产品时。
 总结:在有多个产品系列的系统中,产生各个系列的不同产品。
 效果:
     1分离具体类:客户与类分离,即隐藏创建类的过程。产品的类名也被隐藏,客户端可见。
     2使得易于交换产品系列。系统可以在不同的产品系列切换使用。
     3可以使系统使用同一系统产品。
     4难以支持新种类的产品。
  2.buider 创建复杂对象
 适用性:
     1当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
     2当构造过程必须允许被构造的对象有不同表示时。
 总结:复杂对象有不同的组成部分和装配方式时。
 效果:
     1可以了解产品的内部表示。
     2将构造代码和表示代码分开。
  3.factory method 创建对象的接口,让子类决定实例化哪一个类。
 适用性:
     1一个类不知道所创建的对象的类型的时候。
     2一个类希望由它的子类来指定所创建的对象的时候。
 总结:不确定创建的是哪个具体类时。
 效果:
     1客户端代码只与接口有关。
     2使创建对象的方法更灵活。
  4.prototype 通过原形创建对象
 适用性:
     1独立与产品的系统创建产品时,且不知道产品的类型。
     2运行时创建类
 总结:不知道具体类型时创建对象
 效果:
     1客户端隐藏产品类型。
     2动态配制应用
  5.singleton 保证一个类只有一个实例
 适用性:
     1类只有一个实例而且客户可以从一个众所周知的访问点访问它。
 总结:一个类只有一个实例
 效果:
    1控制唯一实例的访问
    2通过单例对象在运行时配制系统
结构型模式
  1.adapter 接口转换
 适用性:
     1想用一个已经存在的类,但是它的接口不符合需求
     2创建一个可以复用的类,该类可以和其他不相关的类协同工作
 总结:使拥有不同接口的类可以一起使用
 效果:
     1通过适配器增加类的接口
  2bridge 分离抽象部分和实现部分
 适用性:
     1类的抽象部分和实现部分都可以通过子类的方法扩充。bridge模式可以对不同的抽象接口  和实现进行组合。
 总结:在扩充类的抽象部分时,实现部分也要扩充的情况
 效果:
     1分离实现部分和接口
     2提高可扩充性
  3composite 使得单个对象和组合具有一致性
 适用性:
     1表示对象部分-整体层次结构
     2希望拥护忽略组合对象与单个对象的不同。
 总结:组合对象和单个对象有相同的特性
 效果:
     1简化客户端代码
     2容易增加新类型的组件
  4decorator 动态的给对象增加职责
 适用性:
     1在不影响其他对象的情况下,以动态,透明的方式给对象添加职责
     2处理可以撤消的职责
     3不能用子类的方式进行扩展
 总结:动态的扩展对象的职责和撤消职责
 效果:
     1比静态继承更灵活
     2避免在层次结构高层的类有太多的特征
  5facade  为接口提供统一的界面
 适用性:
     1为复杂的子系统提供一个简单的接口时。
     2客户程序与抽象的实现部分之间存在很大的依赖性
 总结:系统要有统一的接口
 效果:
     1对客户屏蔽子系统组件
     2实现子系统和客户的松耦合
  6flyweight 大量的细粒度对象
 适用性:
     1使用大量对象,造成很大的存储开销。对象的大多数状态都可变为外部状态。
 效果:
     1减少存储开销,增加运行开销。
  7proxy 控制对象的访问
 适用性:
     1远程代理
     2虚代理
     3保护代理
 总结:在访问目的对象前做一些预处理
 效果:
      1)remote proxy可以隐藏一个对象寸与不同地址空间的事实。
      2)Virtual proxy可以进行最优化,例如根据要求创建对象。
      3)protection proxy允许在访问一个对象时有一些附加的事务处理
行为模式:
  1command 将请求封装成一个对象
 适用性:
     1在不同的时刻指定,排列,执行请求
     2支持取消操作
     3支持修改日志
 总结:请求具有统一操作和排列情况
 效果:
     1将具体命令和如何实现该操作的对象解耦
     2可以像其他对象一样进行扩展
     3可以将各种命令组合。
  2observer 当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
 适用性:
     1当一个抽象模型有两个方面,其中一方面依赖与另一方面,将二者封装在独立的对象中以  使他们可以独立的改变和复用
     2当一个对象的该边需要同时改变其他对象
 总结:当对象改变时,要通知其他对象改变
 效果:
      1降低目标和观察者之间的耦合
     2支持广播通信
     3以外更新
  3state 对象在其内部状态改变时改变它的行为
 适用性:
     1一个对象的行为取决于它的状态
     2一个操作中含有庞大的多分支的条件语句
 总结:状态决定对象的行为时:
 效果:
     1将与特定状态相关的行为局部化,将不同的状态的行为分割开来。
     2使得状态转换显示化
     3state对象可以被共享
  4strategy 封装算法,使算法可独立于使用它的客户而变化
 适用性:
     1许多相关的类仅仅是行为有异。"策略"提供了一种用多个行为中的一个行为来配制一个类   的方法。
     2需要使用一个算法的不同变体
     3不想让客户知道算法相关的数据结构
     4类的操作中以多个条件语句的形式出现。
 效果:
     1提取一系列可重用的算法
     2消除条件语句
     3提供多种算法和方法
  5template method 定义算法的骨架,而将一些步骤延迟到子类中。
 使用性:
     1一次性实现算法的不变部分,并将可变的行为留给子类实现。
     2控制子类扩展
 效果:
     1实现代码的复用
    
  6visitor 为元素定义新的操作
 适用性:
     1需要一个对象结构中的对象进行很多不同的并且不相关的操作。
     2定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。
 效果:
     1访问者模式使得易于增加新的操作
     2集中相关的操作
     3增加元素子类困难