转自:http://hi.baidu.com/hannick/blog/item/e820d8947d51a541d1135e54.html
设计模式一览表
注:加*的为GoF的23种设计模式。
一、 创建模式
工厂模式分类:
简单工厂(Simple Factory)模式:又称静态工厂方法模式(Static Factory Method Pattern)。
工厂方法(Factory Method)模式:又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式。
抽象工厂(Abstract Factory)模式:又称工具箱(Kit或Toolkit)模式。
1. 简单工厂(Simple Factory)模式
又称静态工厂方法模式,是类的创建模式,由一个工厂对象决定创建出哪一种产品类的实例。
简单工厂模式简略类图:
工厂类角色(Creator):含有一个静态工厂方法,在客户端的直接调用下创建产品对象。
注:一般在工厂类的静态工厂方法中使用分支语句(如switch),根据相应的类型实例化具体的产品类。缺点是如果有新的产品加入到系统中,就需要修改工厂类,将必要的逻辑加入到工厂类中。
2. 工厂方法(Factory Method)模式*
又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式,是类的创建模式。其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
工厂方法模式简略类图:
抽象工厂角色(Creator),具体工厂角色(Concrete Creator),抽象产品角色(Product),具体产品角色(Concrete Product)。
注:工厂方法模式由于使用了多态性,克服了简单工厂模式的缺点,在引入新的产品时只需加入新的具体工厂角色即可。
3. 抽象工厂(Abstract Factory)模式*
又称工具箱(Kit或Toolkit)模式,其用意是向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。
抽象工厂模式简略类图:
注:抽象工厂模式是为多个产品等级结构的系统而设计的。抽象工厂模式和工厂方法模式的最大区别是:工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
4. 单例(Singleton)模式*
单例模式的3个特点:某个类只能有一个实例;它必须自行创建这个实例;它必须自行向整个系统提供这个实例。
单例模式实现方式:
1. 饿汉式单例类:
2. 懒汉式单例类:
5. 多例(Multiton)模式
实际上就是单例模式的自然推广。
应用举例:
语言和地区类的应用。
多例模式或多例类的特点:多例类可以有多个实例;多例类必须自己创建,管理自己的实例,并向外界提供自己的实例。
6. 建造(Builder)模式*
建造模式可以将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
建造模式的简略类图:
抽象创建者角色(Builder);具体建造者角色(Concrete Builder);导演者角色(Director);产品角色(Product)。
应用举例:
JavaMail(利用了JAF:Java Activation Framework库包)先创建邮件的各个部分,然后组成一个邮件。
7. 原型(Prototype)模式*
通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。
原型模式的简略类图:
应用举例:
Java对象的复制实现:深复制和浅复制
二、 结构模式8. 适配器(Adapter)模式*把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 适配器模式的简略类图:
目标角色(Target);源角色(Adaptee);适配器角色(Adapter)。 9. 缺省适配(Default Adapter)模式作为适配器模式的一个特例,缺省适配模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。 10. 合成(Composite)模式*合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。 合成模式的简单类图:
应用举例: Java AWT库。 11. 装饰(Decorator)模式*装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。 装饰模式的简单类图:
应用举例: Java I/O库 12. 代理(Proxy)模式*代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。 代理模式的简单类图:
13. 享元(Flyweight)模式*FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。 分类: 享元模式能做到共享的关键是区分内蕴状态和外蕴状态。 内蕴状态存储在享元内部,不会随环境的改变而有所不同。 外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。 将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。 享元模式的简单类图:
14. 门面(Facade)模式*外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。 Session门面模式是J2EE模式的一种,实际上也就是门面模式在J2EE框架中的应用;Session门面模式用一个SessionBean作为门面,封装一个工作流程中的商务对象之间的相互作用,Session门面对象管理商务对象并为客户端提供一个粗粒度的服务层。 15. 桥梁(Bridge)模式*用意是将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。其提供了一种用聚合关系实现弱耦合的解决方案,即将继承关系转换为组合关系。 桥梁模式简略类图:
系统含有两个等级结构:抽象化等级结构和实现化等级结构。 抽象化角色(Abstraction):抽象化给出的定义,保存有一个对实现化对象的引用。 修正抽象化角色(Refined Abstraction):扩展抽象化角色,改变和修正父类对抽象化的定义。 实现化角色(Implementer),具体实现化角色(Concrete Implementer)。 应用举例: 1.大多数驱动器的实现(如JDBC驱动器)。 2.飞机制造: 飞机制造商:空中巴士(Airbus),波音(Boeing),和麦道(McDonnell-Douglas); 飞机类型:载客飞机(Passenger Plane)和载货飞机(Cargo Plane)。
由于这个“转世”桥梁实际上是一个聚合关系,因此可以动态地变化。所以如果系统需要加入新的飞机种类或者飞机制造商的话,已有的各个角色不必改变,需要改变的仅仅是一个多态性的聚合关系。 注:一般而言,实现化角色中的每一个方法都应当有一个抽象化角色中的某一个方法与之相对应,但是反过来则不一定。换言之,抽象化角色的接口比实现化角色的接口宽。实现化角色则往往仅为实现抽象化角色的相关行为而存在。
|