设计模式
一、单例
保证一个类 只有一个实例,并提供一个全局访问点。
需要私有化构造方法
private Singleton(){
}
1、饿汉
private static final Singleton INSTANCE = new Singleton();
2、懒汉
- 双检锁
// volatile 可以保证可见性,禁止指令重排
private static volatile Singletion instance;
public static Singleton getInstance(){
if(instance == null){
synchronized (Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
- 同步方法
private static Singletion instance;
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
- 静态内部 类,即实现了延迟加载,也保证了线程安全。
类的加载和初始化是分开进行的,且初始化发生在类首次使用时。静态内部类
SingletonHolder 被加载并初始化的时刻是在其包含的静态成员被访问
时。
JVM 的类初始化机制
- 懒加载
- 线程安全:类的初始化过程由 JVM 来控制,它保证了多线程之间对于
Singleton实例的唯一性和可见性,且只会执行一次初始化。
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
- 枚举 天然单例
二、原型
浅克隆 深克隆
三、工厂
1、简单工厂
通过静态方法的参数不同,创建不同的对象
2、工厂
一个工厂;创建对象
3、抽象工厂
多个工厂;创建不同的对象
代理
不能直接访问真实对象,需要添加一个代理对象
装 饰
添加新的功能。实现,将被装饰的类作为一个成员变量 在编译期间,关系就已经确立
适配器
把原本不兼容的接口通过适配修改做到统一。
将一个类的接口转换成另外一个接口,接口类型通过set方法注入。 io 流 。客户可以指定装饰哪一个类
桥接
业务场景两个维度,如形状和颜色 ,将第二个维度抽象成接口,通过set方法进注入。
- 抽象部分:提供高层控制逻辑,依赖于完成底层实际工作的实际对象。
- 实现部分:为所有具体实现声明通用接口。抽象部分仅能通过在这里声明的方法与实现对象交互。
桥接模式的作用
- 分离抽象与实现
- 较少类的数量
- 提高系统的可扩展性
- 促进服用

应用场景
- JDBC 驱动
- slf4j
- 银行转账
- 转账分类:网上转账,柜台转账,ATM转账 抽象层
- 转账用户类型:普通用户,银卡用户,金卡用户... 实现层
- 消息管理
- 消息类型:即时消息,延迟消息 抽象层
- 消息分类:手机短信,邮件,站内信... 实现层