设计模式简析
设计模式根据其目的(模式用来干什么)分为创建型模式、结构型模式和行为性模式3种。其中创建型工厂模式主要用于创建对象;结构型模式主要用于处理类与对象的组合;行为型模式主要用于描述对类和对象怎样交互和分配职责。
创建型模式:
工厂方法模式:在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类完成,即通过工厂子类来确定究竟应该去实例化哪一个产品类。这个模式的好处在于如果你需要新添加一类产品,不需要修改原来的代码,只需要添加一个工厂子类和一个产品子类即可。满足”开闭原则“。
抽象工厂模式:抽象工厂模式是工厂模式的泛化版,在工厂模式中,每一类具体工厂只能生产一种具体产品,而在抽象工厂方法模式中,每一类具体工厂可以生产多种具体产品。这种模式的有点在于如果想增加一个具体的工厂,只需要添加相应的产品子类即可;当一个产品的多个对象被设计一起工作时,它能够保证客户端始终只使用同一个产品中的对象。缺点是如果想增加一个具体的产品那么原有的代码将会有很大程度的更改不再满足“开闭原则”。
建造者模式:建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的构造。这种模式的有点在于客户端不必知道产品的内部组成的细节,将产品本身与产品的创建解耦,使得相同的创建过程可以创建不同的对象;增加新的建造者无需修改原有的代码。缺点是这种模式创建的产品一般具有较多的共同点,其组成成分相似。如果产品间差异过大。就不适用了。
原型模式:原型模式是一种对象创建型模式,用原型实例指定创建对象的实例,并且通过复制这些原型创建新的对象。它的优点在于当创建新的对象实例较为复杂时,简化对象的创建过程。提高效率。缺点是对现有类配备克隆方法时,必须修改源代码。违背”开闭原则”。
单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问方法。它的优点是由于系统内存中只存在一个对象,所以可以节约资源,提高系统性能。缺点是不易扩展,且单例类的职责过重。
结构型模式:
适配器模式:适配器模式就是将一个接口转化成客户希望的另一个接口,它能使接口不兼容的那些类可以一起工作。它的优点在于增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端来说是透明的,而且提高了适配者的复用性。
桥接模式:一个具体的对象有两个维度,分别定义每个维度的抽象方法,并在一个维度的抽象类中将另一个维度的抽象类作为其的一个成员变量,在该类的具体实现方法中就可以调用另一个类的具体实现方法,用关联关系替代继承关系。它的优点在于提高了系统的可扩充性,在两个变化的维度中任意扩展一个维度,都不需要修改原有系统。缺点是要求正确识别出两个系统独立变化的维度,因此其使用范围有一定的局限性。
组合模式:将多个对象组合在一起,然后用树形结构来表示整体与部分的关系。它的关键是定义了一个抽象的构件类,既可以代表叶子,也可以代表容器,客户端针对该抽象构件类进行编程,无需知道它表示的到底是叶子还是容器,对其进行统一处理。它的优点在于可以方便的对层次结构进行控制。
装饰模式:动态的为一个类增加额外的职责。它的优点在于具体构件类和具体装饰类可以独立变化,增加新的装饰类和构建类无需修改原有的代码。缺点是它相对于继承来说更容易出错,排错也很困难。
外观模式:定义一个高层接口,使外部与一个子系统的交互都通过这个这个接口。它的优点在于降低了子系统与外部的耦合性。使子系统的实现更加容易。
享元模式:利用共享技术,将一些细小的对象重复使用,不占用过多的资源。
代理模式:两个类之间不直接交互,而是通过代理的交互。
行为型模式:
职责链模式:将多个能够响应某一请求的类,从低到高串成一条链,然后将请求沿着这条链传递,直到某一个类作出响应为止。优点在于降低请求类与处理类之间的耦合性。
命令模式:将一个请求的实现、发起、响应的过程分别封装,降低了系统之间的耦合度。
解释器模式:定义语言的文法,并且建立一个解释器来解释该语言中的句子。
迭代器模式:该模式就是通过遍历的类来访问数据,这样不需要知道内部数据的表示情况。它的主要优点在于它支持以不同的方式来遍历一个聚合对象。
中介者模式:对象与对象之间的交互不直接进行,而是通过中介者来实现交互。中介者将对象之间的交互抽取出来,大大减少对象间的关系数量。
备忘录模式:在不破坏封装的前提下,将一个对象完整地保存在另一个对象中,并在需要还原的时候能够恢复到原先的状态。
观察者模式:多个对象依赖于一个目标对象,当该目标对象发生改变时,多个对象也会随之发生改变。它的主要优点在于在观察目标和观察者之间建立了一个抽象的耦合,支持广播通信。
状态模式:当对象的状态改变后,对象的行为也随之改变,就像改变了类一样。在类的定义中添加一个状态,对应不同的状态,类中的方法有不同的响应。其优点在于将所有与某个状态有关的行为放在一个类中,并且可以方便的增加新的状态,只需要改变对象状态就可以改变对象的行为。
策略模式:实现目的的方法有多种,将每一种方法封装成一个类,它们继承同一个父类,在需要时可以相互替换。
模板方法模式:父类中定义了某一事件的具体操作步骤,并实现了部分或全部的方法,但在子类中,可以重定义父类中的方法,使之表达出不同的意思。
访问者模式:将一个对象中的每一个元素抽取出来,单独的作为一个类,并继承一个公共的父类,然后定义一个抽象的操作,提供对每一个元素的操作方法,在子类中实现具体的操作方法,这样就能在不改变元素类的前提下,通过添加新的操作方法子类实现对元素的新的操作。