概括和总结了部分设计模式,主要是一些常见的设计模式,这些设计模式在各种SDK中经常见到,如STL、JDK等等,自己在编写一些框架时也经常用到,其中单例和模板模式最常用。
1 单例模式
在整个程序执行过程中,某个类只有一个实例(对象),这个实例可以被多个模块获取使用。
定义:Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)
用途:当系统中,某个类只需要一个对象存在时,可以使用单例模式。如在一个系统中各个模块公用一个计数器对象或log对象。
优点:可以减少资源的占用,可以优化共享数据的访问等。
2 工厂模式
工厂模式使用同一个工厂对象创建不同的产品对象。其中,不同的产品具有类似的属性,如轿车和卡车都是车。产品在工厂内部实例化,并由工厂赋值给产品对象。产品的方法在产品类内实现。
定义:Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)
用途:工厂模式主要用于创建不同的对象,适用于灵活、可扩展的框架。
优点:封装性好,代码结构清晰,易于扩展,解耦合。
3 建造者模式
建造者模式包括产品、建造者和导演。每个建造者都对应一个产品,通过导演控制建造者创建产品。导演中有产品不同的操作指令。建造者模式有一部分模板方法模式,产品接口与产品类之间是模板模式。
定义:Separate the construction of a complex object from its representation so that the same construction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)
用途:相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
优点:封装性,易于扩展,低耦合。通过导演,可以直接创建和控制内部封装的产品,不需要考虑实现细节,并且内部的产品易于扩展。
4 模板方法模式
模板方法模式其实就是通过接口编程,在抽象类中声明方法,在实现类中定义方法。将多个类的共同属性抽象为接口,如手枪、步枪和冲锋枪,在继承的类中编写方法的实现。
定义:Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.(定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。)
用途:多个类有共同的方法,逻辑相似;将核心的算法放在模板,通过子类进行扩展。
优点:封装不变的共同点,扩展具体的实现,便于接口控制实现。
5 代理模式
代理不创建被代理对象,而是绑定被代理对象。被代理对象有一些方法,代理绑定对象后,会代替对象执行这些方法。在代理中,可以实现一些针对被代理对象的操作,如执行的日志,或对象执行方法后的处理等。
定义:Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供一种代理以控制对这个对象的访问。)
用途:代理可以使对象的职责更清晰,帮助被代理对象处理一些事物。如Spring AOP。
优点:结构清晰,易于扩展。
6 适配器模式
适配器可以将两个不同的系统(类)连接到一起,通过适配器可以在A系统中执行B系统的方法。采用适配器模式,可以使用同一接口操作不同的系统的方法。
定义:Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.(将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。)
用途:当需要对某一系统进行扩展时,不想修改原系统,或新增的类不符合系统接口时,可以采用适配器进行连接。
优点:可以将不同的类关联到一起,提供类的复用性,比较灵活,容易安装和卸载。
7 观察者模式
观察者模式包含观察者和被观察者,被观察者可以绑定和取消多个观察者,观察者对被观察者的操作进行响应。当被观察者进行某些操作时,可以主动通知观察者进行操作的响应。此外,还包括抽象观察者和被观察者,抽象被观察者负责通知观察者,具体被观察者负责处理通知前后的操作。抽象观察者声明处理消息的方法,具体观察者负责实现该方法。
定义:Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically.(定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。)
用途:某个类的行为会触发一些类时;消息队列类型系统。
优点:抽象耦合,易于增删观察者和被观察者,可以实现一种触发机制。
参考《设计模式之禅》