序号 | 模式名称 | 模式描述 | 应用场景 | 例子 |
1 | 单例模式 (SigletonPattern) |
保证一个类仅有一个实例,并提供一个访问它的全局访问点。 | • 单例类只能有一个实例。 • 单例类必须自己创建自己的唯一实例。 • 单例类必须给所有其它对象提供这一实例。 |
1、每台计算机可以有若干个打印机,但只能有一个Printer Spooler,避免两个打印作业同时输出到打印机。 2、一个具有自动编号主键的表可以有多个用户同时使用,但数据库中只能有一个地方分配下一个主键编号。否则会出现主键重复。 |
2 | 策略模式 (StrategyPattern) |
定义了算法族分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 |
利用抽象类和继承类之间的继承关系,通过多态的表现方式,通过传入不同的继承类,得到该类的方法实现。 | 不同岗位工资不一样 不同的鸭子有不同的特性 |
3 | 观察者模式 (ObserverPattern) |
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 | 将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。 | 气象预报发布/订阅 |
4 | 装饰者模式 (DecoratorPattern) |
以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。 |
1.使用对象组合的方式,做到运行时装饰类。 2.在不修改任何底层代码的情况下,给你的对象予新的职责。 3.可以在不使用创造更多子类的情况下,将对象的功能加以扩展。 |
孙悟空有七十二般变化,他的每一种变化都给他带来一种附加的本领。他变成鱼儿时,就可以到水里游泳;他变成雀儿时,就可以在天上飞行。而不管悟空怎么变化,在二郎神眼里,他永远是那只猢狲。 |
5 | 简单工厂 (SimpleFactoryMethod) |
根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法。 | 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅消费产品。简单工厂模式通过这种做法实现了对责任的分割。 | 数据库根据配置文件进行选择链接 |
5 | 工厂模式 (FactoryMethod) |
定义一个用于创建对象的接口,让子类决定实例化哪一个类。 | 核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。 | 多数据库根据配置选择 |
6 | 建造者模式 (BuilderPattern) |
可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。 | 一个有待建造的产品,而对象的这些性质相当于产品的零件,建造产品的过程就是组合零件的过程。由于组合零件的过程很复杂,因此,这些零件的组合过程往往被外部化到一个称作建造者的对象里,建造者返还给客户端的是一个全部零件都建造完毕的产品对象。 | 电饭锅放进去米和水,取出香喷喷的米饭了 KFC套餐不同,组合类别相同,内容不同 |
7 | 原型模式 (PrototypePattern) |
通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多的同类型对象。 | 创建出更多的同类型对象 | 孙悟空拔根毫毛身外化身 |
8 | 命令模式 (CommandPattern) |
把一个请求或者操作封装到一个对象中。允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。 | 命令的封装。把发出命令的责任和执行命令的责任分割开,委派给不同的对象。请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。 | 事务管理器 |
9 | 适配器模式 (AdapterPattern) |
把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。 | 1、 系统需要使用现有的类,而此类的接口不符合系统的需要。 2、 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。 3、 (对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。 |
USB转换器 插头转换器 变压器 |
10 | 模板模式 (TemplateMethod) |
准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。 | 需要开发抽象类和具体子类的设计师之间的协作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤。代表这些具体逻辑步骤的方法称做基本方法(primitive method);而将这些基本法方法总汇起来的方法叫做模版方法。 | 设计师在抽象类定义粗的范围,开发在继承类编写细化的内容。 |
11 | 合成模式 (Composite Pattern) |
有时又叫做部分-整体模式(Part-Whole)。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与复合元素同等看待。 | 用来描述整体与部分的关系。 | 树叶-树枝 目录树 |
12 | 享元模式 (FlyweightPattern) |
以共享的方式高效地支持大量的细粒度对象。享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State)。 | 个体抽象出类别,将类别注册并维护为内蕴状态。被使用的个体称为外蕴状态。 | 在编辑器系统中大量使用。 输入法词库。 |
13 | 代理模式(ProxyPattern) | 某一个对象提供一个代理,并由代理对象控制对原对象的引用。 | 一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 | 负载均衡服务器 LoadRunner模拟压力测试 WebServices机制 |
14 | 外观模式(FacadePattern) | 外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是外观模式,也称为门面模式。 | 为一个复杂子系统提供一个简单接口 提高子系统的独立性 在层次化结构中,可以使用 模式定义系统中每一层的入口。 |
工作流引擎 医院导医员 |
15 | 桥接模式(BridgePattern) | 将抽象化与实现化脱耦,使得二者可以独立地变化。 | 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。 设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。 一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。 虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。 |
路由器 开关控制的电灯、电风扇 |
16 | 责任链模式(ChainOfResponsibility) | 很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。 | 责任链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。一个链可以是一条线,一个树,也可以是一个环。 | 击鼓传花 |
17 | 访问者模式 (VisitorPattern) |
目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。 | 适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。 | 泛型操作 |
18 | 策略模式 (StrategyPattern) |
针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。 又称为:可插入式(Pluggable)的算法。 准备一组算法,并将每一个算法封装起来,使得它们可以互换。 |
1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2. 一个系统需要动态地在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法类里面,而这些具体算法类都是一个抽象算法类的子类。换言之,这些具体算法类均有统一的接口,由于多态性原则,客户端可以选择使用任何一个具体算法类,并只持有一个数据类型是抽象算法类的对象。 3. 一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户端涉及到不必要接触到的复杂的和只与算法有关的数据。 4. 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。此时,使用策略模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句,并体现面向对象设计的概念。 |
算法替换 |
19 | 备忘录模式 (MementoPattern) |
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 | 1.必须保存一个对象在某一个时刻的部分状态,这样以后需要时才能恢复到先前的状态。 如果用一个接口来让其他对象直接得到被保存对象的内部状态,将会暴露对象的实现细节并破坏对象的封装性。 |
状态记忆、恢复 |
20 | 中介者模式 (MediatorPattern) |
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 将原来两个直接引用或者依赖的对象拆开,在中间加入一个“中介”对象,使得两头的对象分别和“中介”对象引用或者依赖。 |
一组对象以定义良好但是复杂的方式进行通信,产生了混乱的依赖关系,也导致对象难以复用。 |
房屋中介、出国中介 MVC组合模式中的控制层(Control) |
21 | 迭代器模式 (IteratorPattern) |
把对象的职责分离,职责分离可以最大限度减少彼此之间的耦合程度,从而建立一个松耦合的对象。职责分离的要点是对被分离的职责进行封装,并以抽象的方式建立彼此之间的关系。 | 1.迭代器模式提供一种方法可以顺序访问聚合对象中各个元素,但又不暴露该对象的内部表示。
2.支持对聚合对象的多种遍历; |
对象集合控制 |
22 | 解释器模式 (InterpreterPattern) |
在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂的业务语言进行翻译。 | 对复杂的业务语言进行翻译 | 中英文翻译系统 |
23 | 状态模式 (StatePattern) |
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 | 1. 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。 2. 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。 |
工作流不同动作改变审批状态 |
24 | 复合模式 (CompoundPattern) |
结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。 | 需要使用多种模式的组合来满足需求 | 模式的组合,如MVC模式 |
实例下载:C#设计模式例子.rar