这套视频似乎是好多年前录制的了吧,我大学时就下载了,但一直没能坚持看完,最近我才把它看完。这套视频比较适合刚接触设计模式的初学者,很容易理解,代码也能跟着敲。
我写这篇文章仅为记录我的学习,如果哪里理解错了欢迎指正,棕色字体的是我自己都还有点懵逼的。。。
1、简单工厂模式
专门定义一个类来负责创建其他类的实例。
2、工厂方法模式
将工厂进一步抽象,由子类进行对象的实例化,便于扩展
3、抽象工厂模式
抽象工厂中的方法对应产品结构,具体工厂对应产品族去创建具有相同属性的不同产品
4、单例模式
保证一个类只生成唯一的实例对象,达到共享对象与减少资源浪费的目的。
饿汉式即直接在类中创建静态常量对象并提供调用方法。
懒汉式即判断该对象是否为空,为空则创建,否则直接使用。
使用synchronized同步方法可以防止懒汉式单例在多线程中出现的不安全,但影响效率。如果使用单次检查而首次创建时如果前几个线程“同时”进入该检查,仍然会创建多个实例,所以需要双重检查。
5、原型模式
创建一个同数据的新对象,需要实现Cloneable接口及clone()方法。浅度克隆仅创建数值对象,而非数值对象的克隆仅仅是地址引用的克隆,实际上指向同一对象。深度克隆指在clone()方法中重新创建该非数值对象。
6、建造者模式
与工厂方法模式相比,建造者模式中的生成器不仅仅负责创建产品,还负责提供给建造者创建产品属性的方法。
7、装饰模式
为了减少添加新的子类,使用装饰类为对象添加新的功能。为了多次装饰,抽象装饰类需要实现同一个抽象组件接口,生成的装饰对象可以作为具体组件被再次装饰。
8、策略模式
各个策略实现相同的接口,容器类根据客户端传入不同的策略执行不同的具体行为。
9、观察者模式
具体的被观察者继承自Observable并调用setChanged()和notifyObservers(object)触发观察事件,具体的观察者实现Observer接口并在update方法中接收到notifyObservers(object)传入的对象并处理。
10、享元模式
为了共享数据减少内存,在享元工厂中根据key在pool中进行查询,如果已经存在则直接使用,否则重新创建并且加入pool中。
11、代理模式
普通代理就是代理类与真实类实现同一接口,然后在代理类中引用真实类中的方法并添加需要的扩展。
动态代理不用新建代理类,而用handler类实现InvocationHandler接口,并且在invoke方法中使用method.invoke调用真实类的相应的方法。然后在客户端使用Proxy.newProxyInstanc生成代理的委托对象,该委托对象必须是接口。
12、外观模式
使用一个类Facade将不同类中的多个方法再次组合封装成一个方法提供给客户端调用
13、组合模式
组合模式即树形结构,叶节点和枝节点均实现节点抽象,枝节点可以继续扩展,叶节点默认实现父接口管理节点的方法,但不做任何操作,只操作相关属性行为的方法。枝节点实现父接口管理节点的方法后将用变量池管理该对象用于扩展新的枝叶,同时也操作相关属性行为的方法
14、桥接模式
将一个对象和他的“一组属性类”分离,并在该对象的抽象类中引用该抽象属性,因此不管该对象增加子类还是该“一组属性类”增加子类扩展都互不影响。
15、适配器模式
将已知类的接口进行扩展以适应新的需求。
16、解释器模式
用于更新上下文对象内容。为了多次使用解释器,重新赋值时应该更新所有关联字段。
17、中介者模式
为了减少类与类之间的交互,使用中介类进行沟通,减少了类的耦合度,类改变时不会对其它类有影响。
18、职责链模式
一系列流水线式的操作继承自同一抽象类,在一操作完成后调用该抽象类继续执行下一操作,在客户端设置传入下一具体操作。便于客户端控制操作顺序。
19、迭代模式
把迭代功能分离并封装细节。
20、模板方法模式
在抽象类中创建“模板方法”负责调用统一的操作过程,通过实现不同的子类来区分不同的具体步骤。
21、备忘录模式
备忘录模式用于临时保存一个对象,原生对象需要提供备份与还原功能,备忘录类具有与原生对象相同的属性,管理者类用于备忘录的读写。
22、状态模式
将分支判断及其内容封装到不同的状态类中,如果不满足则调用下一状态,调用时需要将状态复位以便遍历所有状态。
23、命令模式
命令模式是指客户端通过invorker类来调用不同的Command来执行具体的目标对象receiver。
24、访问者模式
将被访问对象与访问者分离并抽象,被访问对象接收访问者并调用访问者中的对应的方法以完成访问过程。
25、开放封闭原则
开放封闭原则就是进行更详细的分类,以便于以后只需要增加小分类而不需要修改原先的“大类”
26、单一职责原则
各司其职,一个类不要负责过多功能
27、里氏代换原则
里氏代换原则就是把父类替换成子类程序的行为没有变化,JDK只识别父类对象可以引用子类对象,但不一定符合里氏代换原则
28、依赖倒转原则
高层模块不依赖底层的细节模块,两张都依赖与抽象
29、迪米特法则
迪米特法则就是为了降低类与类之间的耦合度,而不直接交互,也可以与依赖倒转原则结合通过抽象类来访问