【设计模式】概述

在老项目重构时,总觉得设计时缺些东西,设计出来后扩展又不好
有时候为了解决某些问题,想了一个颇复杂的方案,后来发现竟然误打误撞的用了一些设计模式
这里对设计模式进行系统的学习和总结,以便更好的在后续的工作中进行使用

总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下:

创建型模式:

0、简单工厂模式——不属于23种设计模式,不符合开闭原则
● 普通简单工厂:多种产品实现同一个接口,创建多产品时可使用工厂类,通过不同传参,返回不同产品实例
● 多方法简单工厂:在普通简单工厂的基础上,在工厂类中使用不同的方法而非通过传参,返回不同产品实例
● 多静态方法简单工厂:在多方法简单工厂的基础上,将非静态方法变为静态方法,无需创建工厂实例,直接调用方法,返回不同的产品实例

1、工厂方法模式
● 在多方法简单工厂基础上,将工厂类拆为多个,返回不同产品实例
● 在增加产品时,只需要新增实现产品和对应的工厂即可

2、抽象工厂模式
● 一个抽象工厂,派生一个具体工厂;多个抽象产品,派生多个具体产品;一个具体工厂可产生多个具体产品
● 在工厂方法的基础上,有多个抽象产品,每个工厂实例可创建多个产品实例

区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
工厂方法创建 "一种" 产品,他的着重点在于"怎么创建",也就是说如果你开发,你的大量代码很可能围绕着这种产品的构造,初始化这些细节上面。也因为如此,类似的产品之间有很多可以复用的特征,所以会和模版方法相随。
抽象工厂需要创建一些列产品,着重点在于"创建哪些"产品上,也就是说,如果你开发,你的主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一个抽象工厂继承。

3、单例模式
● 判空构造
● 加锁
● 双重判断加锁(常用)
● 静态构造
● 内部类静态构造

4、建造者模式
● 拥有一个指导者(类似于工厂中的Factory,但不是抽象的,只有一个),拥有一个抽象建造者(类似工厂的抽象产品),多个具体建造者(类似工厂的具体产品)
● 使用过程:用户通过告诉指导者需要什么样的建造者参数,来获取不同的建造者;不同建造者内部具体实现不同,最终获取到不同的结果
区别:
与工厂模式的区别是:工厂更注重创建一个实例,区别在于实例本身是不同的;而建造者模式重点在于生成实例本身的内部逻辑不同
“抽象工厂模式(Abtract Factory)解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化”
“工厂模式关心整体,建造者模式关心细节”

5、原型模式
● 使用复制(浅复制或深复制),创造一系列对象,原型类需要实现Cloneable接口
● 符合依赖导致原则

结构型模式:

6、适配器模式
● 类的适配器模式:当期望一个类转化为满足一个新接口的类时,可创建一个新类,继承原类,实现新接口
● 对象的适配器模式:当期望一个对象转化为满足一个新接口的对象时,可创建一个Wrapper类,持有原类,实现新接口
● 接口的适配器模式:当原接口有过多方法不需要全部使用时,可创建一个Wrapper抽象类实现所有方法,再继承抽象类

7、装饰模式
● 装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,在被装饰对象的方法上下进行额外操作

原文地址:https://www.cnblogs.com/shanelau/p/6439544.html