设计模式

设计模式是什么?

设计模式是我们对问题所提出的解决方案,就像一个个蓝图,通过对问题的一些综合考虑,采用最合适的设计方案来解决问题。就像一个工具箱,我们要看具体的情况,来决定使用哪把工具。那么设计模式是如何诞生的呢,设计模式最开始也是一个解决方案,只不过这个方案在各种项目中得到了验证。最终得到认可,是前辈们一个个试验,一步一个坑踩过来,最终被后人们整理,收纳,所归类的出的一种新领域

设计模式的优点

  • 提高我们的思维能力和设计能力
  • 使程序的设计变得标准化、流程化,增强开发效率
  • 对代码来说,提高了可读性和复用性以及可扩展性

设计模式的六大原则

  1. 开闭原则 对扩展开放,对修改关闭
  2. 里氏代换原则 任何基类可以出现的地方,子类一定可以出现
  3. 依赖倒转原则 对接口编程,依赖于抽象不依赖具体
  4. 接口隔离原则 使用多个隔离的接口,比使用单个好
  5. 迪米特法则 一个实体类尽量少与其他实体类有相互作用
  6. 合成复用原则 尽量使用合成/聚合,不使用继承

设计模式的分类

创建型模式:通过提供创建对象的机制,增加已有代码的灵活性和可复用性

创建型有种模式:工厂方法、抽象工厂、建造者、原型、单例

结构性模式:如何将对象和类组装成较大的结构,同时保持结构的灵活和高效

结构型有种模式:适配器、桥接、组合、装饰、外观、享元、代理

行为模式:负责对象间的高效沟通和职责委派

行为型有十一种模式:责任链、命令、迭代器、解释器、中介者、备忘录、观察者、状态、策略、模板方法、访问者

现在我们对设计模式有了初步认识,下面我们对每一种设计模式进行详细了解,并逐一举例

创建型

工厂方法(Factory Method)

将实例化交给工厂类的实现类,实现类负责创建对象。这样就符合了开闭原则,之后我们扩展的时候,只需要创建一个对象,创建工厂,从工厂获取就可以,避免了在原本代码中修改的操作。

以汽车举例

  1. 创建汽车接口,定义好汽车的基本属性,例如颜色、速度
  2. 实现汽车接口,例如奔驰实现汽车接口,将汽车接口中的颜色和速度重写为奔驰的基本信息
  3. 创建工厂接口,因为我们所有的车都需要在工厂中生产
  4. 创建一个奔驰工厂,实现工厂的接口,这样奔驰就可以把车交给工厂去生产了
  5. 用户买车直接找奔驰工厂就可以,通过奔驰工厂可以拿到奔驰对象,不关注是如何造出来的

在工厂方法中,如果我们想加入奥迪这个品牌,只需要创建奥迪的对象,实现汽车接口,创建一个奥迪工厂实现工厂接口,就可以通过奥迪工厂获取到奥迪对象。但缺点也很明显,随着我们的需求增多,类和接口也越来越多,代码整体相对复杂一点。

抽象工厂(Abstract Factory)

简单的来说就是创建工厂的工厂,主要用来创建家族产品。一个产品族的接口,每个子类都可以实现产品

以产品举例子 产品可以有很多,比如手机、显示器、路由器等等。

  1. 创建产品接口,定义好产品的基本属性
  2. 实现产品接口,例如小米实现手机接口,也可以实现显示器接口…
  3. (核心)创建一个超级工厂接口,用来生产产品,例如上述的手机、显示器和路由器
  4. 创建小工厂,例如小米工厂,华为工厂等等,这些工厂都要实现超级工厂。这样超级工厂里的商品就可以给小米工厂制造了
  5. 客户直接去找小米工厂可以获取所有的小米商品,华为则获取所有的华为商品

例如现在小米和华为都想再生产一个鼠标,那么只需要创建一个产品接口,让小米和华为去实现该接口,之后在超级工厂中加入鼠标这个商品,小米工厂和华为工厂就可以生产鼠标这个商品了。相对于工厂方法改动少了,但每次修改超级工厂,都要修改下面的子类,还是存在一些麻烦

建造者(Builder)

建造者模式更注重构建对象的这个过程,通过分步创建一个复杂的对象,将产品的创建与产品的本身进行分离,构建的过程就可以获得不同的对象。在代码中使用链式调用,方便的同时增加了可读性。我们一般通过建造者模式来创建那些有非传参数的对象。

待续…