前言

为什么要学习设计模式?

与简单的Demo不同,一个软件的设计,开发,维护中并不是简单的将功能实现出来,还需要考虑软件的可维护性,可扩展性,可测试性等,如果只根据开发者的直觉去一味地堆砌代码,最后整个项目只会变成一堆屎山。为了维护代码的质量,前人将比较好的代码组织方式与代码之间的交互逻辑总结,也就成为了设计模式,我们在开发中也可以参考这些设计模式,来解决实际问题,提升代码质量。

设计模式

设计模式定义

设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。
总结一下就是设计代码结构的一些通用范式。

设计模式分类介绍

设计模式可以根据其功能和作用将设计理念分为不同的分类,根据经典书籍《设计模式:可复用面向对象软件的基础》,GOF提出的分类方式,目前比较通用的设计模式分类有三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns),下面将要介绍一下这三大类的分类思路以及简要介绍。

创建型模式

创建型模式解决的问题是:如何高效优雅的批量创建对象。它所关注的是对象的创建,包括对象的创建、对象的销毁、对象的复制等。操作逻辑,例如在游戏中生成一大串的敌人,每个敌人都有自己的状态,但是所有的对象都有相同的行为。通过创建型模式,我们可以避免重复创建对象,提高效率。包含工厂方法抽象工厂单例建造者原型五种核心类型。

结构型模式

结构型模式解决的问题是:如何将类或者对象合理的结合在一起形成更大的结构。一个合理的机构可以让我们实现在运行时改变对象之间组合的方式,让组合更加的灵活。也能让我们不需要反复地去创建一个个接口,而只需要关注对象之间的关系即可。适配器模式(转换不兼容接口)、桥接模式(分离抽象与实现)、组合模式(构建树形结构处理整体-部分关系)、装饰器模式(动态添加对象功能)、外观模式(提供统一子系统接口)以及代理模式(控制对象访问权限)

行为型模式

行为型模式解决的问题是:如何分配算法和对象之间的职责。 过预定义交互协议降低对象间耦合度,具体实现包括责任链模式、命令模式、状态模式、策略模式、模板方法模式、观察者模式等。

设计模式详细说明

创造型模式

单例模式(Singleton Pattern)

确保一个类只有一个实例存在,并且一个全局访问点。例如一个班级只能有一个班主任,只要确保这个班主任一直在而且不会变,这样当我们有事情的时候,直接去找到这个班主任即可,而不需要每次去创建一个班主任对象。

设计意图

确保只有一个实例存在和减少对象的创建次数,提高效率。

要求

  • 实例的构造方法必须是私有的,不能被外部调用。(确保只有一个实例存在)
  • 必须有一个全局访问点,用于获取实例。(确保其他对象可以访问这个实例)

什么时候创建这个实例

分为饿汉式懒汉式
饿汉式为在类加载时就创建一个实例,而懒汉式为在第一次调用时才创建一个实例。

getInstance方法

getInstance方法用于获取单例实例,返回类型为单例类的实例。如果我们在饿汉式中调用getInstance方法,那么就会返回已经创建好的实例,而懒汉式中调用getInstance方法,就会创建一个实例。

简单工厂模式(Simple Factory Pattern)

简单工厂模式也称之为静态工厂方法模式。核心是写一个工厂类,工厂类可以实现根据不同的参数来返回不同类的实例。
例如我们有两种不同的敌人,一种是近战小兵,一种是远程小兵,他们都属于敌人这个父类,那么我们可以通过参数去让工厂类生成不同的敌人实例,例如三个近战小兵,一个远程小兵。就像一个工厂一样,拿到订单,输出实例。

设计意图

解决反复创建对象的问题。实现对象的创建和使用分离。

要求

  • 工厂类必须是静态的,不能被外部调用。
  • 工厂类必须有一个方法,用于根据不同的参数来返回不同的对象实例。

工厂模式

工厂模式与简单工厂模式的不同是,简单工厂模式是创建了一个核心工厂,负责所有产品的创建,而工厂模式是仅仅提供了一个接口,告诉工厂子类要如何创建对象,子类根据结构和具体的类进行实现。这样每次要新增一个对象类型的时候,不需要修改原有的核心工厂类,而是为这个新对象创建一个工厂类即可,而不需要修改原有的代码。

设计意图

解决反复修改核心工厂的问题,将产品的创建放到子工厂中实现

抽象工厂模式(Abstract Factory Pattern)

在工厂模式的基础上,通过创建不同的产品接口,让一个工厂可以创建多个产品。与简单工厂相比,虽然也违反了开闭原则,即每次新增一条产品都需要修改对应的工厂类,但是由于抽象工厂与简单工厂的核心工厂类不同,可以有多个工厂,每个工厂可以创建多个产品。

结构型模式

装饰器模式 (Decorator Pattern)

装饰器模式就是在原有对象的基础上,套一层壳,动态地添加新的功能。不修改原有类,在原有类的基础上套上一层壳子(装饰器),通过这一层壳子来实现功能的扩展。这样我们修改的时候就可以只在装饰器上进行扩展,而不需要修改原有类的代码。

适配器模式(Adapter Pattern)

适配器模式的逻辑是将两个原本不通的接口通过一个适配器进行连接来实现,例如第一个接口只能传入整数,第二个接口只能传入字符串,那么我们既不想修改只能传入整数的接口,也不想修改只能传入字符串的接口,那么我们就可以通过适配器模式,加一个中间类来实现这两个接口的连接。

行为型模式

观察者模式 (Observer Pattern)

观察者模式是一种一对多的依赖关系。我有一个支付宝账号,所有我订阅的付费服务都依赖于这个账号,当这个账号的状态发生改变时,所有依赖于它的对象都得到通知,告诉他们账号的状态发生了改变,然后被自动更新。

施工中