23种设计模式实例

源码地址: https://github.com/halibobo/DesignPattern

设计模式

关于

在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领域引入到计算机科学的。
设计模式并不直接用来完成代码的编写,而是描述在各种不同情况下,要怎么解决问题的一种方案。面向对象设计模式通常以类别或对象来描述其中的关系和相互作用,但不涉及用来完成应用程序的特定类别或对象。设计模式能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免会引起麻烦的紧耦合,以增强软件设计面对并适应变化的能力。
并非所有的软件模式都是设计模式,设计模式特指软件“设计”层次上的问题。还有其它非设计模式的模式,如架构模式。同时,算法不能算是一种设计模式,因为算法主要是用来解决计算上的问题,而非设计上的问题。

汇总

设计模式大体分为三类,分别是创建型、结构型和 行为型。

创建型

全部是关于如何创建实例的。这组范例可以被划分为两组:类创建范例及对象创建范例。类创建实例在实例化过程中有效的使用类之间的继承关系,对象创建范例则使用代理来完成其任务。
  • 工厂方法(Factory Method)
  • 抽象工厂 (Abstract Factory)
  • 建造者 (Builder)
  • 原型 (Prototype)
  • 单例 (Singleton)

结构型

都是关于类及对象复合关系的。
  • 代理 (Proxy)
  • 适配器 (Adapter )
  • 桥接 (Bridge)
  • 组合 (Composite)
  • 装饰 (Decorator)
  • 外观 (Facade)
  • 享元 (Flyweight)

行为型

都是关于对象之间如何通讯的
  • 解释器 (Interpreter )
  • 模板方法 (Template Method)
  • 责任链 (Chain of Responsibility)
  • 命令 (Command)
  • 迭代器 (Iterator)
  • 中介者 (Mediator)
  • 备忘录 (Memento)
  • 观察者 (Observer)
  • 状态 (State)
  • 策略 (Strategy)
  • 访问者 (Visitor)

关于

在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领域引入到计算机科学的。
设计模式并不直接用来完成代码的编写,而是描述在各种不同情况下,要怎么解决问题的一种方案。面向对象设计模式通常以类别或对象来描述其中的关系和相互作用,但不涉及用来完成应用程序的特定类别或对象。设计模式能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免会引起麻烦的紧耦合,以增强软件设计面对并适应变化的能力。
并非所有的软件模式都是设计模式,设计模式特指软件“设计”层次上的问题。还有其它非设计模式的模式,如架构模式。同时,算法不能算是一种设计模式,因为算法主要是用来解决计算上的问题,而非设计上的问题。

汇总

设计模式大体分为三类,分别是创建型、结构型和 行为型。

创建型

全部是关于如何创建实例的。这组范例可以被划分为两组:类创建范例及对象创建范例。类创建实例在实例化过程中有效的使用类之间的继承关系,对象创建范例则使用代理来完成其任务。
  • 工厂方法(Factory Method)
  • 抽象工厂 (Abstract Factory)
  • 建造者 (Builder)
  • 原型 (Prototype)
  • 单例 (Singleton)

结构型

都是关于类及对象复合关系的。
  • 代理 (Proxy)
  • 适配器 (Adapter )
  • 桥接 (Bridge)
  • 组合 (Composite)
  • 装饰 (Decorator)
  • 外观 (Facade)
  • 享元 (Flyweight)

行为型

都是关于对象之间如何通讯的
  • 解释器 (Interpreter )
  • 模板方法 (Template Method)
  • 责任链 (Chain of Responsibility)
  • 命令 (Command)
  • 迭代器 (Iterator)
  • 中介者 (Mediator)
  • 备忘录 (Memento)
  • 观察者 (Observer)
  • 状态 (State)
  • 策略 (Strategy)
  • 访问者 (Visitor)

介绍

工厂方法模式

简介

工厂方法模式(Factory method pattern)是一种实现了“工厂”概念的面向对象设计模式。就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”

意图

为一个产品族提供了统一的创建接口。当需要这个产品族的某一系列的时候,可以从抽象工厂中选出相应的系列创建一个具体的工厂类。

参与者
  • Factory:工厂角色
    工厂角色负责实现创建所有实例的内部逻辑
  • Product:抽象产品角色
    抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
  • ConcreteProduct:具体产品角色
    具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。
UML图

enter image description here

实例类图

enter image description here


抽象工厂模式

简介

抽象工厂模式(Abstract factory pattern)是一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。

意图

定义一个接口用于创建对象,但是让子类决定初始化哪个类。工厂方法把一个类的初始化下放到子类。

UML图

enter image description here

实例类图

enter image description here

优点

具体产品从客户代码中被分离出来
容易改变产品的系列
将一个系列的产品族统一到一起创建

缺点

在产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口


建造者(生成器)模式

简介

生成器模式(Builder Pattern),又名:建造模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

意图

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

场景
  • 需要生成的产品对象有复杂的内部结构。
  • 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
  • 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
UML图

enter image description here

实例类图

enter image description here

参与者
  • Builder
    为创建一个Product对象的各个部件指定抽象接口。
  • ConcreteBuilder
    实现Builder的接口以构造和装配该产品的各个部件。
    定义并明确它所创建的表示。
    提供一个检索产品的接口
  • Director
    构造一个使用Builder接口的对象。
  • Product
    表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。
    包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

原型模式

简介

原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。
原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。

意图

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

UML图

enter image description here

实例类图

enter image description here


单例模式

简介

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例

意图

确保一个类只有一个实例,并提供对该实例的全局访问。

UML图

enter image description here

实例类图

enter image description here


代理模式

简介

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

意图

为其他对象提供一个代理以控制对这个对象的访问。

UML图

enter image description here

实例类图

enter image description here


持续更新中…
坚持原创技术分享,您的支持将鼓励我继续创作!