`
uule
  • 浏览: 6310860 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

设计模式总结

阅读更多

 设计模式总结

W3C设计模式总结

http://blog.csdn.net/joyney/category/434480.aspx

http://www.jdon.com/designpatterns/index.htm

http://www.cnblogs.com/kid-li/category/44668.html

 

简单工厂模式、工厂方法模式、抽象工厂模式三种工厂模式详细解读

Singleton 单件模式解决的问题是:实体对象个数问题(这个现在还不太容易混)

FactoryMethod 工厂方法模式解决的问题是:某个对象的创建工作

                 http://www.runoob.com/design-pattern/factory-pattern.html

AbstractFactory 抽象工厂模式解决的问题是:“一系列互相依赖的对象”的创建工作.

                 http://www.runoob.com/design-pattern/abstract-factory-pattern.html

工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory).
这两个模式区别在于需要创建对象的复杂程度上

 

Builder 生成器模式解决的问题是:“一些复杂对象”的创建工作, 子对象变化较频繁,对算法相对稳定

 

1、 原型模式:prototype模式:

         注意:原型模式是通过拷贝自身来创建新的对象,这一点和其他创建型模式不相同。

  java.lang.Object 本身即定义有 clone() 方法 ,因此所有的对象基本上 皆具自我复制之能力,不过真正要让对象支持复制,则对象必须实作 java.lang.Cloneable 这个接口

 

2、建造者模式:builder模式

Builder模式是一步一步创建一个复杂的对象,因为一个复杂的对象,不但有很多大量组成部分,如汽车,有很多部件:车轮 方向盘 发动机还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一辆汽车,这个装配过程也很复杂(需要很好的组装技术),Builder模式就是为了将部件和组装过程分开.

http://uule.iteye.com/admin/blogs/1200975

 

  

Builder模式与AbstractFactory模式的区别:

建造者模式(Builder)与抽象工厂模式很相象,但是,Builder返回完整的一个产品,而AbstractFactory返回一系列有关系的产品;在抽象工厂模式中,客户采用AbstractFactory生成自己要用的对象,而在建造者模式中,客户指导Builder类如何生成对象,或者如何合成一些类来构成建造类,侧重于一步步构造一个复杂对象,然后将结果返回。

 

ConcreteBuilder builder = new ConcreteBuilder();
Director director = new Director(builder);
director.construct();
House house = builder.getHouse(); 

 

参考:http://blog.csdn.net/joyney/archive/2009/03/18/4000741.aspx

http://www.blogjava.net/amigoxie/archive/2007/03/18/104610.html

http://www.jdon.com/designpatterns/builder.htm

 

3、Singleton模式

主要作用是保证一个类Class只有一个实例存在。

注意默认构造函数。

http://uule.iteye.com/blog/2385012

 

4、外观模式:Facade模式

为子系统中的一组接口提供一个一致的界面.

从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到 Facade 接口的变化。

http://uule.iteye.com/admin/blogs/2385120



  

意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。

何时使用:

1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可

2、定义系统的入口。

如何解决:客户端不与系统耦合,外观类与系统耦合。

关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。

应用实例: 1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。

2、JAVA 的三层开发模式。

3、一个电源总开关可以控制四盏灯、一个风扇、一台空调和一台电视机的启动和关闭。该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的外观模式设计。

优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。

 

缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

  

 

5、代理模式:Proxy模式

代理模式的作用是:为对象提供一种代理以控制对这个对象的访问。 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式一般涉及到三个角色:
抽象角色 :声明真实对象和代理对象的共同接口;
代理角色 :代理对象角色 内部含有对真实对象的引用,从而可以操作真实对象 ,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色 :代理角色所代表的真实对象,是我们最终要引用的对象。

 

6、适配器模式:Adapter模式

1.概念:
把一个类的接口变换成客户端所希望的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

(就是将两个类的方法组合起来,使其可以在一个类中使用!)
2.两种形式

a.类的适配器模式 b.对象的适配器模式

http://uule.iteye.com/admin/blogs/2385053

 

http://www.iteye.com/topic/339198

http://www.iteye.com/topic/74417

 

7、模板模式:Template模式

http://www.runoob.com/design-pattern/template-pattern.html

使用场景:

1、有多个子类共有的方法,且逻辑相同。 

2、重要的、复杂的方法,可以考虑作为模板方法。

一. 模式概述

      摸板方法(Template Method)模式是一种非常简单而又经常使用的设计模式.先创建一个父类,把其中的一个或多个方法留给子类去实现 ,这实际上就是在使用摸板模式.所谓的摸板模式可以这样来理解:"在一个类中定义一个算法,但将此算法的某些细节留到子类中去实现.换句话说,基类是一个抽象类,那么你就是在使用一种简单形式的摸板模式."

二. 模式意图

      将一个类的基本部分抽取出来放到一个基类中,这样它就不必重复出现在几个派生类里. 

 

 模式结构与参与者

抽象摸板角色:

        1. 定义了一个或多个抽象操作,以便让子类实现.

        2. 定义并实现了一个摸板方法.

 具体摸板角色:

        1. 实现父类所定义的一个或多个抽象方法.

        2. 每一个抽象摸板角色都可以有任意多个具体摸板角色与之对应.

        3. 每一个具体摸板角色都可以给出这些抽象方法的不同实现.

  

 

8、装饰模式:Decorator模式

装饰器模式(Decorator Pattern,或油漆工模式允许向一个现有的对象添加新的功能,同时又不改变其结构

譬如我们将把一个形状装饰上不同的颜色,同时又不改变形状类

http://uule.iteye.com/admin/blogs/2385114

 

优点:装饰模式和继承都是对功能的扩展,而装饰模式使用的是组合,可以不用继承而达到这一效果。使用过多的继承会增加系统的复杂性和偶合性

不使用类继承来扩展对象功能。 

 

缺点:装饰模式要产生一些辅助性的对象,但这些对象看上去都比较像,不是很容易检查(好的命名应该是提高检查的一个办法)

 

主要是解决:“过度地使用了继承来扩展对象的功能 ”

装饰模式和继承都是对功能的扩展,而装饰模式使用的是组合,使用过多的继承会增加系统的复杂性和偶合性。

上面调用类似我们读取文件时的调用:

FileReader fr = new FileReader(filename);
BufferedReader br = new BufferedReader(fr);

  

实际上Java 的I/O API就是使用Decorator模式实现的,I/O变种很多,如果都采取继承方法,将会产生很多子类,显然相当繁琐.

 java.io库是最好的例子

想要扩展功能,装饰者提供了有别于继承的另外一种选择。是一个很好的符合了开闭原则的设计模式。

  

总结:适配器模式主要是为了接口的转换,而装饰者模式关注的是通过组合来动态的为被装饰者注入新的功能或行为(即所谓的责任)。

适配器将一个对象包装起来以改变其接口;装饰者将一个对象包装起来以增强新的行为和责任;而外观将一群对象包装起来以简化其接口

 

 

7、组合模式:composite模式

将对象组合成树形结构 以表示部分和整体的层次结构.

组合模式使得用户对单个对象和组合对象的适用具有一致性.

 

    组合模式是将对象之间的关系以数据结构中的2 叉树表现出来,使得客户端将单纯的元素与复杂元素同等看待,这样的话使得用户在操作不同的子类元素时可以和根节点元素一样操作,在透明模式下即根元素和叶元素公用同一个接口达到共同的结果。

组合模式就是解决部分与整体的关系的一种模式。

 

意图

将对象组合成树形结构以表示“整体 - 部分”的层次结构。 Composite 使得用户对单个对象和组合对象的使用具有一致性

动机

客户代码过多的依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(非抽象接口)的变化将引起客户代码的频繁变化代码的代码维护和扩展的困难,我们需要将客户代码与复杂的对象容器结构解偶。

适用性

l          想表示对象的部分 - 整体层次结构

l          希望用户忽略组合对象与单个对象的不同 ,用户将统一地使用组合结构中的所有对象。

结构

 

 

参与者

l          抽象构件( Component )角色                           IComposite               

l          树叶构件( Leaf )角色                 (Employees )

l          树枝构件                       (Boss)

Composite 模式的优点

1.          客户代码不依赖复杂对象本身的结构变化

2.          用户不需要特别关心复杂对象的具体结构只要等同于根对象操作

http://uule.iteye.com/blog/868224

 

 

9、桥接模式: Bridge模式

将抽象部分与实现部分分离 ,使它们都可以独立的变化。

 

任何事物对象都有抽象和行为之分,例如人,人是一种抽象,人分男人和女人等;人有行为,行为也有各种具体表现,所以,“人”与“人的行为”两个概念也反映了抽象和行为之分。

在面向对象设计的基本概念中,对象这个概念实际是由属性和行为两个部分组成的,属性我们可以认为是一种静止的,是一种抽象,一般情况下,行为是包含在一个对象中,但是,在有的情况下,我们需要将这些行为也进行归类,形成一个总的行为接口,这就是桥模式的用处。

 

http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html

http://www.jdon.com/designpatterns/bridge.htm

http://flysnail.iteye.com/blog/183668

 

 

11、备忘录模式:memento模式

1. 定义
        在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

2. 使用的原因
         想要恢复对象某时的原有状态

public class Originator {

  public int number;

  public File file = null;

  public Originator(){}

  // 创建一个Memento
  public Memento getMemento(){
    return new Memento(this);
  }

  // 恢复到原始值
  public void setMemento(Memento m){
     number = m.number;
     file = m.file;
  }

}

 

private class Memento implements java.io.Serializable{

  public int number;

  public File file = null;

  public Memento( Originator o){

    number = o.number;
    file = o.file;

  }

}

 

可见 Memento中保存了Originator中的number和file的值. Originator中number和file值改变的话,通过调用setMemento()方法可以恢复.

Memento模式的缺点是耗费大,如果内部状态很多,再保存一份,无意要浪费大量内存.

http://www.jdon.com/designpatterns/memento.htm

http://blog.csdn.net/joyney/archive/2009/04/07/4054594.aspx

http://peirenlei.iteye.com/blog/364399

 

12、

  • 大小: 31.9 KB
  • 大小: 4.7 KB
  • 大小: 51.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics