【十】Java设计模式GOF23之总结

设计模式主要有3个大分类

创建型模式:用来建造对象

一、单例模式:

保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。

常见应用场景

1.全局计数器采用单例模式,不然不好同步。

2.应用程序的日志应用,共享日志文件一直处于打开状态,所以只能有一个实例去操作,否则内容不好追加。

3.数据库连接池的设计也用单例,否则浪费资源。

4.spring中的bean默认都是单例。

5.servlet是单例。

6.spring mvc/ structs1,控制器对象是单例。

7.项目中工具类,一般都用单例,没必要浪费资源。

常见实现方式

1.饿汉模式(线程安全、调用效率高、不能延时加载)

2.懒汉模式(线程安全、调用效率不高(getInstance方法用了synchronized同步方法)、可以延时加载)

3.静态内部类模式(线程安全、调用率高、可以延时加载)

4.枚举单例(线程安全、调用率高、不能延时加载、不会被反射反序列化生成多个实例

代码

各种单例模式代码演示

UML图

【十】Java设计模式GOF23之总结

二、工厂模式

选择实现类、创建对象统一管理和控制。

实现了创建者和调用者的分离

用工厂方法代替new操作。

常见应用场景

1.JDK中Calendar的getInstance方法

2.JDBC中Connection对象的获取

3.Hibernate中SessionFactory创建session对象

4.spring中IOC容器创建管理bean对象

5.反射中Class对象的newInstance

1.简单工厂模式

用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码

代码

【十】Java设计模式GOF23之简单工厂模式(静态工厂模式)

UML图

【十】Java设计模式GOF23之总结

2.工厂方法模式

用来生产同一等级结构中的固定产品。(支持增加任意产品)

代码

【十一】Java设计模式GOF23之工厂方法模式

UML图

【十】Java设计模式GOF23之总结

3.抽象工厂模式

用来生产不同产品族的全部产品。(对于增加新的单个产品,无能为力,支持增加产品族)

它是工厂方法模式的升级版,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

代码

【十二】Java设计模式GOF23之抽象工厂模式

UML图

【十】Java设计模式GOF23之总结

三、建造者模式

分离了对象子组件的单独构造(有builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。

这个模式适用于:某个对象的构建过程复杂的情况下。

由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。

也就是实现了构建算法、装配算法的解耦,实现了更好的复用。

常见应用场景

1.SpringBuilder类的append方法

2.SQL中的PreparedStatement

3.JDOM中的DomBuilder、SAXBuilder

代码

【十三】Java设计模式GOF23之建造者模式

UML图

【十】Java设计模式GOF23之总结

四、原型模式prototype

如果通过new创建一个对象需要非常繁琐的数据准备和访问权限,则可以用原型模式。

就是java中的克隆,以某个对象为原型,复制出新对象。新对象具备原型对象的特点。

优势:效率高(直接克隆,避免了重新执行构造过程步骤)

代码

【十四】Java设计模式GOF23之原型模式

结构型模式:

一、适配器模式

二、桥接模式

三、装饰模式

四、组合模式

五、外观模式

六、享元模式

七、代理模式

核心作用:通过代理,控制对对象的访问

可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。(Spring AOP的围观实现)。从而实现将统一流程代码放到代理类中处理。

应用场景

1.安全代理:屏蔽对真实角色的直接访问

2.远程代理:通过代理类处理远程方法调用RMI

3.延迟加载:先加载轻量级的代理对象,真正需要时再加载真实对象

1.静态代理

自己定义代理类

代码

【十五】Java设计模式GOF23之静态代理

UML图

【十】Java设计模式GOF23之总结

2.动态代理

动态生成代理类

代码

这里使用反射来实现的

【十六】Java设计模式GOF23之动态代理

UML图

【十】Java设计模式GOF23之总结

行为型模式:

一、模板方法模式

二、命令模式

三、迭代器模式

四、观察者模式

主要用于1:N的通知

应用场景:聊天室。发布/订阅。网络游戏。消息广播。事件监听。

多个订阅者称为观察者。需要同步给多个订阅者的数据封装到对象中,称为目标。

代码

【十七】Java设计模式GOF23之观察者模式

UML图

【十】Java设计模式GOF23之总结

五、中介者模式

六、备忘录模式

七、解释器模式

八、状态模式

九、策略模式

十、责任链模式

十一、访问者模式