设计模式总结

创建型:

1.单件模式(Singleton Pattern)     

定义: 确保某一个类只有一个实例(通过私有构造函数来保证类外部不能对类进行实例化),并提供一个全局访问点(创建一个返回该类对象的静态方法)

2. 工厂方法模式(Factory Method) 

意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

主要解决:主要解决接口选择的问题。

何时使用:我们明确地计划不同条件下创建不同实例时。

简单工厂方法,又叫做静态工厂方法..一个静态函数根据参数,创建返回同一个接口下的产品…
一个工厂类,一个产品抽象类。

工厂方法,为每一个产品,提供一个工厂类,工厂类负责该产品的实例化过程.注意这里和建造者模式的不同.
多个工厂类,一个产品抽象类。

使用场景:

  • 数据库访问..(简单工厂方法),传入数据库类型,实例化数据库访问接口
  • 依赖注入的工厂函数..添加同一类产品的工厂到一个列表中.

3.抽象工厂(Abstract Factory) 

定义:提供一个创建一系列相关或相互依赖对象的接口,使得客户端可以在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象,强调的是”系列对象“的变化。

主要解决:主要解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

一个抽象工厂类,多个工厂类,多个产品抽象类。

4. 建造者模式(Builder) 

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:主要解决在软件系统中,有时候面临着”一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

工厂方法和建造者模式的区别

  1. 在工厂方法模式里,我们关注的是一个产品整体,如汽车整体,无须关心产品的各部分是如何创建出来的;但在建造者模式中,一个具体产品的产生是依赖各个部件的产生以及装配顺序,它关注的是“由零件一步一步地组装出产品对象”。简单地说,工厂模式是一个对象创建的粗线条应用,建造者模式则是通过细线条勾勒出一个复杂对象,关注的是产品组成部分的创建过程。
  2. 工厂方法模式创建的产品一般都是单一性质产品,如成年超人,都是一个模样,而建造者模式创建的则是一个复合产品,它由各个部件复合而成,部件不同产品对象当然不同。这不是说工厂方法模式创建的对象简单,而是指它们的粒度大小不同。一般来说,工厂方法模式的对象粒度比较粗,建造者模式的产品对象粒度比较细。

两者的区别有了,那在具体的应用中,我们该如何选择呢?是用工厂方法模式来创建对象,还是用建造者模式来创建对象,这完全取决于我们在做系统设计时的意图,如果需要详细关注一个产品部件的生产、安装步骤,则选择建造者,否则选择工厂方法模式。

5. 原型模式(Prototype)

意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

主要解决:在运行期建立和删除原型。

何时使用: 1、当一个系统应该独立于它的产品创建,构成和表示时。 2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。 3、为了避免创建一个与产品类层次平行的工厂类层次时。 4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

一般使用就是clone()函数..

结构型:

6. 适配器模式(Adapter Pattern) 

意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

主要解决:主要解决在软件系统中,常常要将一些”现存的对象”放到新的环境中,而新环境要求的接口是现对象不能满足的。

何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

7. 桥接模式(Bridge Pattern) 

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

主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。

将一个类中会变的部分,抽象出来,减少复杂度

8. 装饰模式(Decorator Pattern) 

意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

何时使用:在不想增加很多子类的情况下扩展类。

比如说物品和装备..物品和装备都有一些共用的属性..装备也属于物品但是装备有很多额外的属性….


9. 组合模式(Composite Pattern) 
10. 外观模式(Facade Pattern) 
11. 享元模式(Flyweight Pattern) 
12. 代理模式(Proxy Pattern) 
13. 模板方法(Template Method) 
14. 命令模式(Command Pattern) 
15. 迭代器模式(Iterator Pattern) 

行为型:

16. 观察者模式(Observer Pattern) 

鼠标事件的监听与触发


17. 解释器模式(Interpreter Pattern) 
18. 中介者模式(Mediator Pattern) 

所有事件的监听和触发..只通过中介者


19. 职责链模式(Chain of Responsibility Pattern) 
20. 备忘录模式(Memento Pattern) 
21. 策略模式(Strategy Pattern) 
22. 访问者模式(Visitor Pattern) 
23. 状态模式(State Pattern)

发表评论