目录
源码中的设计模式
源码中用到的设计模式 源码中用到的设计模式_许诗宇的博客-CSDN博客
spring中使用的设计模式 spring中使用的设计模式_许诗宇的博客-CSDN博客
Mybatis中使用的设计模式 Mybatis中使用的设计模式_许诗宇的博客-CSDN博客
设计模式的分类
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式(简单工厂模式)、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
具体的设计模式的总结在链接的网页中,这一页是设计模式的入口。
其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下:
常用设计模式一览表
类型 | 模式名称 | 学习难度 | 使用频率 |
---|---|---|---|
创建型模式 Creational Pattern | 单例模式 Singleton Pattern | ★☆☆☆☆ | ★★★★☆ |
创建型模式 Creational Pattern | 简单工厂模式 Simple Factory Pattern | ★★☆☆☆ | ★★★☆☆ |
创建型模式 Creational Pattern | 工厂方法模式 Factory Method Pattern | ★★☆☆☆ | ★★★★★ |
创建型模式 Creational Pattern | 抽象工厂模式 Abstract Factory Pattern | ★★★★☆ | ★★★★★ |
创建型模式 Creational Pattern | 原型模式 Prototype Pattern | ★★★☆☆ | ★★★☆☆ |
创建型模式 Creational Pattern | 建造者模式 Builder Pattern | ★★★★☆ | ★★☆☆☆ |
结构型模式 Structural Pattern | 适配器模式 Adapter Pattern | ★★☆☆☆ | ★★★★☆ |
结构型模式 Structural Pattern | 桥接模式 Bridge Pattern | ★★★☆☆ | ★★★☆☆ |
结构型模式 Structural Pattern | 组合模式 Composite Pattern | ★★★☆☆ | ★★★★☆ |
结构型模式 Structural Pattern | 装饰模式 Decorator Pattern | ★★★☆☆ | ★★★☆☆ |
结构型模式 Structural Pattern | 外观模式 Façade Pattern | ★☆☆☆☆ | ★★★★★ |
结构型模式 Structural Pattern | 享元模式 Flyweight Pattern | ★★★★☆ | ★☆☆☆☆ |
结构型模式 Structural Pattern | 代理模式 Proxy Pattern | ★★★☆☆ | ★★★★☆ |
行为型模式 Behavioral Pattern | 职责链模式 Chain of Responsibility Pattern | ★★★☆☆ | ★★☆☆☆ |
行为型模式 Behavioral Pattern | 命令模式 Command Pattern | ★★★☆☆ | ★★★★☆ |
行为型模式 Behavioral Pattern | 解释器模式 Interpreter Pattern | ★★★★★ | ★☆☆☆☆ |
行为型模式 Behavioral Pattern | 迭代器模式 Iterator Pattern | ★★★☆☆ | ★★★★★ |
行为型模式 Behavioral Pattern | 中介者模式 Mediator Pattern | ★★★☆☆ | ★★☆☆☆ |
行为型模式 Behavioral Pattern | 备忘录模式 Memento Pattern | ★★☆☆☆ | ★★☆☆☆ |
行为型模式 Behavioral Pattern | 观察者模式 Observer Pattern | ★★★☆☆ | ★★★★★ |
行为型模式 Behavioral Pattern | 状态模式 State Pattern | ★★★☆☆ | ★★★☆☆ |
行为型模式 Behavioral Pattern | 策略模式 Strategy Pattern | ★☆☆☆☆ | ★★★★☆ |
行为型模式 Behavioral Pattern | 模板方法模式 Template Method Pattern | ★★☆☆☆ | ★★★☆☆ |
行为型模式 Behavioral Pattern | 访问者模式 Visitor Pattern | ★★★★☆ | ★☆☆☆☆ |
设计模式的六大原则
1、开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
2、里氏代换原则(Liskov Substitution Principle)
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科
3、依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。
5、迪米特法则(最少知道原则)(Demeter Principle)
为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承,即多使用组合。
设计模式学习的要素
1、设计模式要解决的问题(使用该设计模式的场景)
2、设计模式的解法(结构图+关键代码)
3、设计模式的应用实例(软件+生活)
4、设计模式的优缺点及注意事项
设计模式的简要介绍
创建型模式
工厂方法模式:有抽象工厂,多少个产品就有多少个具体工厂类。
简单工厂模式:静态工厂方法,一个静态方法/工厂 生产所有产品。
抽象工厂模式:有抽象工厂,生产一族产品,一个工厂,多个方法,生产多种产品。具体工厂生产具体的一族产品。
单例模式:该类只有一个实例,私有构造函数,静态的getInstance方法。
饿汉式,private static final。
双重检查锁定懒汉式,private volatile static,里面两个if判断,synchronized 该类.class。
IoDH,内部类Holder private static,内部类的变量instance private static final,调用Holder.instance
枚举类,enum SingletonInstance 里面有个INSTANCE
建造者模式:产品类有多个部分,建造类有多个方法,分别创建产品类的多个部分,指挥者类有construct方法,调用注入指挥者类的建造类的各个方法,构建出一个产品。
原型模式:产品类有clone方法,返回一个与自己一样的产品,视情况完成浅拷贝或深拷贝。
结构型模式
适配器模式:把用户的请求转换为适配者接口的调用。对象适配器,用户需要抽象类A的方法a,现在有适配者类B的方法b,类C继承A,内部被注入B,实现方法a,内部调用B的b方法。类适配器,C继承B,实现A的接口,实现方法a,内部调用继承来的b方法。
装饰器模式:不改变对象本身功能,给对象增加额外的新行为。抽象产品类接口A有方法a。具体实现类B实现A。装饰类C实现A,注入一个A,方法a内调用A的方法a。具体装饰类D继承C,方法a内实现自己的逻辑+super.a()。
代理模式:用户不直接访问对象,采用代理类来间接访问对象。抽象接口A有方法a,具体实现类B实现A。代理类实现A,注入一个A,方法a内调用A的方法+自己的逻辑。
外观模式:为子系统中的一组接口提供一个统一的入口。一堆具体类A,B。外观类C,内部注入A,B,提供方法给用户使用,方法内部调用A,B的方法。
桥接模式:类存在两个独立变化的维度,将每个维度独立出来。抽象类A和抽象类B,A内部被注入B。具体类C继承A,D继承B,C里有自己的方法,同时还调用被注入的B的方法。
组合模式:让叶子对象和容器对象的使用具有一致性。透明组合模式,抽象构建类A有增删和方法a。叶子类B继承A,增删方法抛出异常,实现方法a。容器类C基础A,内部有容器,容纳多个A,实现增删方法,方法a是对内部所有的A,调用它们的a方法。安全组合模式,A和B只有方法a,C有a和增删方法。
享元模式:将具有相同内部状态的对象存储在享元池中,享元池中的对象是可以实现共享的。内部状态可以共享,外部状态由用户保存。抽象享元类A,提供方法设置内部状态和接受外部状态。具体享元类B,继承A。享元工厂C,内部有B的集合,提供方法返回B,保证内部状态相同B只有一个。
行为型模式
策略模式:将算法的定义与使用分开,使用算法的环境类针对抽象策略类进行编程。抽象策略类A,方法a。具体策略类B继承A。环境类C,内部注入A,方法c内部调用A的方法a。
模板方法模式:抽象类A有模板方法a,定义整个算法的框架,抽象方法b,具体方法c,钩子方法d。具体模板类B继承A,实现b,看情况实现c和d,从而影响方法a的执行结果。
观察者模式:一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。抽象观察类A,有update方法。具体观察类B,继承A,实现update方法。抽象被观察类C,有增删观察者方法,通知方法notify。具体被观察类D,继承C,内部有A的容器,实现增删观察者,实现notify方法,调用所有A的update方法,业务方法完成后,调用D的notify方法。推模式,将需要的数据作为update的参数。拉模式,将D自己作为update的参数或者B里有A的引用。
迭代器模式:提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示。抽象迭代器A,有访问元素的方法a。抽象容器类,有方法b返回一个A。具体容器类C的方法b返回一个具体迭代器D。D内部存在一个C的引用,用来实现方法a。
责任链模式:让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。抽象处理者类A,内部存在一个类型A的引用successor,有处理方法a。具体处理者类B,继承A,实现a,视情况自己处理或者调用successor的a方法。纯的职责链模式,一环要么处理,要么不处理。不纯的,可以处理并且让别人也处理。
命令模式:请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。具体业务执行类A有方法a。抽象命令类B有方法b。具体命令类C,继承B,内部被注入一个A,方法b内调用A的方法a。用户类D,内部被注入一个B,调用B的方法b。撤销,C内保存一个历史状态。命令队列,增加一个命令队列类E,内部有B的容器类,方法内执行所有B的b。请求日志,C实现Serializable接口,命令执行时,将自己打印出来。恢复时,将打印的C恢复,挨个执行C的b。
备忘录模式:捕获一个对象的内部状态,并在该对象之外保存这个状态,在以后将对象恢复到原先保存的状态。备忘录类A,保存B的属性。普通类B,有createMento方法,返回一个保存B的属性的A,有restore方法,根据参数A,恢复到A保存的状态。备忘录保存类C,内部保存一个或多个A。
状态模式:允许一个对象在其内部状态改变时改变它的行为。抽象状态类A,有方法a。具体方法类B,继承A,实现a。环境类C,内部有一个A的引用,内部方法调用A的a方法。C在方法执行完或者其他地方,改变A的引用,切换成其他状态。
访问者模式:可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
中介者模式:用一个中介对象来封装一系列的对象交互。
解释器模式:定义一个语言的文法,并且建立一个解释器来解释该语言中的句子。
注意:本文在编写时参照了Introduction · 设计模式Java版
这位的设计模式博客写的很好