一、Java 中有几种设计模式?
Java 中一般认为有 23 种设计模式
分为三大类:
1. 创建型模式 5 种
① 工厂方法模式
② 抽象工厂模式
③ 单例模式
④ 建造者模式
⑤ 原型模式
2. 结构型模式 7 种
① 适配器模式
② 装饰器模式
③ 代理模式
④ 外观模式
⑤ 桥接模式
⑥ 组合模式
⑦ 享元模式
3. 行为型模式 11 种
① 策略模式
② 模板方法模式
③ 观察者模式
④ 迭代子模式
⑤ 责任链模式
⑥ 命令模式
⑦ 备忘录模式
⑧ 状态模式
⑨ 访问者模式
⑩ 中介者模式
⑪ 解释器模式
二、什么是单例设计模式?
1. 单例模式定义
单例模式确保某个类只有一个实例,而
且自行实例化并向整个系统提供这个实
例
在计算机系统中,线程池、缓存、日志
对象、对话框、打印机、显卡的驱动程
序对象常被设计成单例,选择单例模式
就是为了避免不一致状态
2. 单例模式的特点
① 单例类只能有一个实例
② 单例类必须自己创建自己的唯一实例
③ 单例类必须给所有其他对象提供这一
实例
④ 单例模式保证了全局对象的唯一性,
比如系统启动读取配置文件就需要单
例保证配置的一致性
3. 单例的四大原则
① 构造器私有化
② 以静态方法或者枚举返回实例
③ 确保实例只有一个,尤其是多线程
环境
④ 确保反序列化时不会重新构建对象
4. 实现单例模式的方式
(1) 饿汉式 (立即加载):
饿汉式单例在类加载初始化时就创建好
一个静态的对象供外部使用,除非系统
重启,这个对象不会改变,所以本身就
是线程安全的
Singleton 通过将构造方法限定为 private
避免了类在外部被实例化,在同一个虚拟
机范围内,Singleton 的唯一实例只能通
过 getInstance() 方法访问 (事实上,通过
Java 反射机制是能够实例化构造方法为
private 的类的,会使 Java 单例实现失效)
/**
* 饿汉式(立即加载)
*/
public class Singleton1 {
/**
* 私有构造
*/
private Singleton1() {
System.out.println("构造函数Singleton1");
}
/**
* 初始值为实例对象
*/
private static Singleton1 single = new Singleton1();
/**
* 静态工厂方法
* @return 单例对象
*/
public static Singleton1 getInstance() {
System.out.println("getInstance");
return single;
}
public static void main(String[] args){
System.out.println("初始化");
Singleton1 instance = Singleton1.getInstance();
}
}
(2) 懒汉式 (延迟加载):
该示例虽然用延迟加载方式实现了懒汉
式单例,但在多线程环境下会产生多个
Singleton 对象
/**
*