设计模式概述和分类

设计模式》是经典的书。
设计模式分为三种类型,共 23 种

一、创建型模式

单例模式、抽象工厂模式、工厂模式、原型模式、建造者模式
总结:
★工厂模式中,重要的是工厂类,而不是产品类。产品类可以是多种形式,多层继承或者是单个类都是可以的。但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。
★使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。
★工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。

区别:
简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
[

](https://blog.csdn.net/superbeck/article/details/4446177)

简单工厂模式

工厂方法

工厂方法是针对每一种产品提供一个工厂类。
通过不同的工厂实例来创建不同的产品实例。
在同一等级结构中,支持增加任意产品。
image.png
测试代码:

  1. public static void main(String[] args) {
  2. // 创建奥迪制造工厂
  3. AudiCarMakeFactory audiCarDriverFactory = new AudiCarMakeFactory();
  4. // 开奥迪
  5. audiCarDriverFactory.getCar().drive();
  6. System.out.println("----------------");
  7. // 创建奔驰制造工厂
  8. BenzCarMakeFactory benzCarDriverFactory = new BenzCarMakeFactory();
  9. // 开奔驰
  10. benzCarDriverFactory.getCar().drive();
  11. }

抽象工厂

抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产suv,跑车,
那么每一个工厂都要有创建suv,跑车的方法。
应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。
这里的产品线指的是:AudiCarMakeFactory (奥迪生产工厂),BenzCarMakeFactory(奔驰生产工厂)
这里的产品指的是:SuvCar,SportsCar
image.png

  1. public static void main(String[] args) {
  2. // 奥迪抽象制造工厂
  3. AudiCarMakeFactory audi = new AudiCarMakeFactory();
  4. SportsCar sportsCar = audi.getSportsCar();
  5. sportsCar.driver();
  6. SuvCar suvCar = audi.getSuvCar();
  7. suvCar.driver();
  8. System.out.println("------------------------------");
  9. // 奔驰抽象制造工厂
  10. BenzCarMakeFactory benz = new BenzCarMakeFactory();
  11. SportsCar sportsCar1 = benz.getSportsCar();
  12. sportsCar1.driver();
  13. SuvCar suvCar1 = benz.getSuvCar();
  14. suvCar1.driver();
  15. }


二、结构型模式

适配器模式、桥接模式、装饰者模式组合模式、外观模式、享元模式、代理模式

适配器模式

对象适配器模式是另外6种结构型设计模式的起源。
设计模式概述和分类 - 图3
适配器模式的优缺点:
优点:
更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
更好的扩展性:在实现适配器功能的时候,可以扩展自己源的行为(增加方法),从而自然地扩展系统的功能。
缺点:
会导致系统紊乱:滥用适配器,会让系统变得非常零乱。例如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
[

](https://blog.csdn.net/mrkohaku/article/details/79087688)

类适配器

对象适配器

接口适配器

装饰器模式

uml 类图说明:
image.png
装饰者模式介绍:
在不改变原有的对象的基础之上,将功能附加到对象之上。
提供了比继承更有弹性的替代方案(扩展原有对象功能)

装饰器模式类结构如下:
Component:组件接口类,定义被装饰类的基本功能
ConcreteComponent:组件接口的基本实现类
Decorator:装饰器角色类, 实现并持有一个 Component 对象实例
ConcreteDecorator:装饰器的实现类

优点:
1、继承的有力补充,比继承灵活,不改变原有对象的情况之下,给对象一个扩展功能。
(继承在扩展功能是静态的,必须在编译时就确定好,而使用装饰者可以在程序运行时决定,
装饰者也是建立在继承的基础之上的)
2、通过使用不同的装饰类以及这些类的排列组合,可以实现不同的效果
3、符合开闭原则

缺点:
1、会出现更多的类,更多的代码,增加程序的复杂性
2、动态装饰,多层装饰会更复杂。
3、装饰环节如果很多的话,会造成装饰器类膨胀
4、装饰器层层嵌套比较复杂,使用者必须清楚所有的装饰器类及其用途;

桥接模式

image.png

  1. public static void main(String[] args) {
  2. // 模拟微信支付
  3. WxPayChannel wxPayChannel = new WxPayChannel(new PayFaceMode());
  4. wxPayChannel.payment("111", "20220409", BigDecimal.valueOf(123.00));
  5. System.out.println("------------------");
  6. // 模拟支付宝支付
  7. AlipayPayChannel alipayPayChannel = new AlipayPayChannel(new PayPasswordMode());
  8. alipayPayChannel.payment("111", "20220409", BigDecimal.valueOf(123.00));
  9. }

组合模式

参考:https://blog.csdn.net/pengjunlee/article/details/54974452
• 组合模式的安全性是指:从客户使用组合模式上看是否更安全。如果是安全的,那么就不会有发生误操作的可能,能访问的方法都是被支持的功能。
• 组合模式的透明性是指:从客户使用组合模式上看是否需要区分到底是组合对象还是叶子对象。如果是透明的,那就不用再区分,对于客户而言,都是组件对象,具体的类型对于客户而言是透明的,是客户无须关心的。


透明性uml类图:
设计模式概述和分类 - 图6
安全性uml类图:
image.png

主要优点有:

组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;

其主要缺点是:

设计较复杂,客户端需要花更多时间理清类之间的层次关系;
不容易限制容器中的构件;
不容易用继承的方法来增加构件的新功能;


代理模式

三、行为行模式

模板方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式
解释器模式(interpreter模式)、状态者模式策略模式职责链模式(责任链模式)
注意:不同的书籍对分类和名称略有区别。

模板方法模式

策略模式

职责链模式

观察者模式(监听器)

状态模式