设计模式(Design Pattern)

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。

创建型 (Creational)

主要用于描述如何创建对象

  • 单例模式 (Singleton Pattern)

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法. (为了防止在外部对其实例化,将其构造函数设计为私有。)

主要优点在于提供了对唯一实例的受控访问并可以节约系统资源;
其主要缺点在于因为缺少抽象层而难以扩展,且单例类职责过重。

适用情况包括:系统只需要一个实例对象;客户调用类的单个实例只允许使用一个公共访问点

  • 简单工厂模式 (Simple Factory Pattern)

定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态 (static) 方法,因此简单工厂模式又被称为静态工厂方法 (Static Factory Method) 模式。它属于类创建型模式。

  • 工厂方法模式 (Factory Method Pattern)

定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式(Factory Pattern),又可称作虚拟构造器模式 (Virtual Constructor Pattern) 或多态工厂模式 (Polymorphic Factory Pattern)。它属于类创建型模式。

包含四个角色:抽象产品、具体产品、抽象工厂和具体工厂

主要优点是增加新的产品类时无须修改现有系统,并封装了产品对象的创建细节,系统具有良好的灵活性和可扩展性;
其缺点在于增加新产品的同时需要增加新的工厂,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。

适用情况包括:一个类不知道它所需要的对象的类;一个类通过其子类来指定创建哪个对象;将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定。

  • 抽象工厂模式 (Abstract Factory Pattern)

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为 Kit 模式,属于对象创建型模式。

四个角色: 抽象工厂、具体工厂、抽象产品和具体产品

抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构。

主要优点是隔离了具体类的生成,使得客户并不需要知道什么被创建,而且每次可以通过具体工厂类创建一个产品族中的多个对象,增加或者替换产品族比较方便,增加新的具体工厂和产品族很方便;
主要缺点在于增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。

适用情况包括:一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节;系统中有多于一个的产品族,而每次只使用其中某一产品族;属于同一个产品族的产品将在一起使用;系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

  • 原型模式 (Prototype Pattern)

使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。

三个角色: 抽象原型类、具体原型类和客户类

主要优点是简化复杂对象的创建过程,扩展性较好,还可以使用深克隆的方式保存对象状态,在需要的时候使用可辅助实现撤销操作。
主要缺点是需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了“开闭原则”;在实现深克隆时需要编写较为复杂的代码。

适用情况包括:创建新对象成本较大,新的对象可以通过原型模式对已有对象进行复制来获得;如果系统要保存对象的状态;需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态。

  • 建造者模式 (Builder Pattern)

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。

四个角色: 抽象建造者、具体建造者、产品角色和指挥者
指挥者类,该类的作用主要有两个:一方面它隔离了客户与生产过程;另一方面它负责控制产品的生成过程。

主要优点在于客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象,每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,符合“开闭原则”,还可以更加精细地控制产品的创建过程;
主要缺点在于由于建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,因此其使用范围受到一定的限制,如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

适用情况包括:需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性;需要生成的产品对象的属性相互依赖,需要指定其生成顺序;对象的创建过程独立于创建该对象的类;隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同类型的产品。

结构型 (Structural)

主要用于描述如何实现类或对象的组合。

  • 适配器模式 (Adapter Pattern)

  • 桥接模式 (Bridge Pattern)

  • 组合模式 (Composite Pattern)

  • 装饰模式 (Decorator Pattern)

  • 外观模式 (Facade Pattern)

  • 享元模式 (Flyweight Pattern)

  • 代理模式 (Proxy Pattern)

行为型 (Behavioral)

主要用于描述类或对象怎样交互以及怎样分配职责。

  • 职责链模式 (Chain of Responsibility Pattern)

  • 命令模式 (Command Pattern)

  • 解释器模式 (Interpreter Pattern)

  • 迭代器模式 (Iterator Pattern)

  • 中介者模式 (Mediator Pattern)

  • 备忘录模式 (Memento Pattern)

  • 观察者模式 (Observer Pattern)

  • 状态模式 (State Pattern)

  • 策略模式 (Strategy Pattern)

  • 模板方法模式 (Template Pattern)

  • 访问者模式 (Visitor Pattern)

设计原则
  • 单一职责原则 (Single Responsibility Principle, SRP)

  • 开闭原则 (Open-Closed Principle)

  • 里氏代换原则 (Liskov Substitution)

  • 依赖倒换原则 (Dependence Inversion Principle, DIP)

  • 接口隔离原则 (Interface Segregation Principle, ISP)

  • 合成复用原则 (Composite Reuse Principle, CRP)

  • 迪米特法则 (Law of Demeter, LoD)

------ END ------
0%