一.设计模式的六大原则:
1. 开闭原则:即对扩展开放,对修改关闭,实现热插拔效果
2. 里氏代换原则:是继承复用的基石,任何基类出现的地方都可以用衍生类替换,并增加新的功能
3. 依赖倒转原则:依赖于抽象,面向接口编程
4. 接口隔离原则:使用多个隔离的接库降低耦合性
5. 迪米特法则:一个实体应尽量少的与其他实体发生作用
6. 合成复用原则:尽量使用合成/聚合的方式
二.23种设计模式
1.工厂模式:
1)单工厂模式:面向接口编程,工厂类输入参数为某个标志(告诉工厂类需要创建的实际类型),返回值为接口类型,即可完成功能
2)多工厂模式:针对不同实体类对象的创建,构造不同的工厂方法,每个工厂方法返回值即为实体类共同的接口
3)静态工厂模式:即声明创建不同实体类对象的工厂方法为静态方法,则可以不用创建工厂对象本身,而直接通过工厂类.工厂方法()实现
4)抽象工厂模式:相同接口的不同实体类对应的不同工厂类需要实现共有的接口,以及实现其对应的接口方法,从而构造不同实体类的对象
2.单例模式:
好处:1)避免频繁创建对象时的系统开销
2)降低了系统内存的使用频度,减少GC压力
3)可以保证中心化服务的稳定运行
线程安全的单例模式
1. private static class SingletonFactory{
2. private static Singleton instance = new Singleton();
3. }
4. public static Singleton getInstance(){
5. return SingletonFactory.instance;
6. }
1. private static synchronized void syncInit() {
2. if (instance == null) {
3. instance = new SingletonTest();
4. }
5. }
6.
7. public static SingletonTest getInstance() {
8. if (instance == null) {
9. syncInit();
10. }
11. return instance;
12. }
3.建造者模式
工厂模式与建造者模式区别:工厂模式关注的是创建单个产品,建造者模式则关注创建符合对象,一般而言建造者内部会有保存抽象接口类型的集合原型模式
4.原型模式
浅复制:当一个对象复制后,基本数据类型的变量会呗重新创建,引用类型指向原对象所指
1. public Object clone() throws CloneNotSupportedException {
2. Prototype proto = (Prototype) super.clone();
3. return proto;
4. }
深复制:当一个对象复制后,其基本数据类型和引用类型都需要重建
public Object deepClone() throws IOException, ClassNotFoundException {
1. /* 写入当前对象的二进制流 */
2. ByteArrayOutputStream bos = new ByteArrayOutputStream();
3. ObjectOutputStream oos = new ObjectOutputStream(bos);
4. oos.writeObject(this);
5.
6. /* 读出二进制流产生的新对象 */
7. ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
8. ObjectInputStream ois = new ObjectInputStream(bis);
9. return ois.readObject();
10. }
1. public class Prototype implements Cloneable {
2. public Object clone() throws CloneNotSupportedException {
3. Prototype proto = (Prototype) super.clone();
4. return proto;
5. }
6. }
以上是5种创新型设计模式,接下来是7种结构型模式
5.适配器模式
1) 类的适配器模式:目的是使得Targetable接口的实现类具有Source类的功能,即创建一个适配类继承Source类,实现Targetable接口
2) 对象的适配器模式:凭借组合方式,利用对象属性,从而实现该对象的功能
3) 接口的适配器模式:首先创建某个接口的抽象类(实现所有方法),然后创建一个适配器类继承该抽象类,并重写想要的方法。
6.装饰者模式
装饰者和被装饰者需要实现相同的接口,装饰者中采用组合方式具有被装饰者的属性引用,适用场景是动态扩展类的功能
7. 代理模式
使用代理模式利于功能划分,便于后期维护,即客户端访问代理服务器,由代理服务器调用服务端逻辑处理,一般来说采用组合方式,将服务端对象引用作为代理类的属性,然后客户端请求代理类时,实际上是其服务端引用进行逻辑处理
8. 外观模式
将功能类的子功能模块作为属性保存,功能类的功能实际上是通过子功能模块有序执行,从而起到解耦合作用
9.桥接模式
基本思想是把事物与具体实现分开,使他们可以独立的变换,即将抽象化和实现化解耦合
即假设相同接口A的实现类有多个B,C,有一个抽象类将接口A作为属性引用,抽象类中的方法是基于接口A来实现,当需要基于B实现抽象类中的方法时,只需要set注入抽象类中实现属性引用,这样调用的方法即基于B来实现,例如JDBC的DriverManager连接不同的数据库
10. 组合模式
又称为部分-整体模式,处理树形问题,比如在一个类中定义其父节点和子节点的属性引用
11. 享元模式
目的是实现对象的共享,从而减少内存开销,类似于JDBC的连接池(getConnection()时若连接池还有剩余连接则直接返回并从连接池中删除,否则返回空),当在共享池中发现符合条件的享元单元,则直接返回;否则需要创建,大大减少了实例数量,实现了资源的重复利用
12. 策略模式
定义了一系列的算法,并将这些算法封装起来,使他们可以相互替换,算法的变换不会影响到使用算法的用户,策略模式多用在算法决策系统,外部用户只需要决定使用哪个算法即可
13. 模版方法模式
有一个抽象类,有主方法和多个抽象方法,子类继承抽象类并实现了其抽象方法,当子类对象复制给抽象类引用,抽象类引用调用主方法时,主方法中执行的方法即为子类重定义的抽象方法
14. 观察者模式
被观察者发生变化时会通知其所有的观察者,观察者也随之变化,类与类之间的关系为观察者与被观察者
有一个抽象类管理着所有观察者列表,包括增加观察者,删除观察者,通知所有观察者等等,被观察对象必须继承这个抽象类,当自身发生变化时通知所有观察者,所有的观察者进行相应的处理
15. 迭代子模式
迭代器模式就是指顺序访问聚集对象中元素,这个过程分别两种对象分别为聚集对象(需要访问的对象)和迭代对象(用于对聚集对象进行访问),集合对象一般为聚集对象(迭代器对象作为其属性引用,除此之外还具有多个集合方法),迭代器对象(集合对象作为其属性引用,除此之外还定义了很多迭代器方法,包括previous返回前一个元素,next()返回后一个元素,hasNext()是否有后一个元素等)
16. 责任链模式
每个对象持有下一个对象的引用,请求在该链上传递,直到某个对象决定处理该请求
17. 命令模式
命令模式的目的是达到命令的发送者和执行者之间解偶,实现请求与执行分离
18. 备忘录模式
保存一个对象的状态,以便恢复对象,其中包括原始类(定义创建备忘录以及从备忘录中恢复属性的方法),备忘录类(定义需要保存的属性),备忘录存储类(保存备忘录)
19. 状态模式
当对象状态发生变化后同时改变其行为,一般为状态类(定义不同的状态集合),上下文类(当前状态)
20. 访问者模式
将数据结构和作用于数据结构上的操作解耦合,使得操作集合可以自由演化,适用于数据结构相对稳定但算法易变化的系统,将有关行为集中到一个访问者对象中,而不影响数据结构,通过增加访问者来增加算法或者行为
21.中介者模式
用于降低类与类之间的耦合性,,类与类之间的关系及调度交由Mediator处理,只需要维护好中介类与实体类之间的依赖关系,由中介去统一调度行为
22. 解释器模式
用于做各种解释器,包括正则表达式的解释器等等