参考笔记:深入理解Java设计模式:单例模式及其饿汉式与懒汉式的对比,-CSDN博客
目录
1.什么是设计模式
设计模式是在大量的实践中总结和理论化之后优的代码结构、编程风格、以及解决问题的思考方式
2.经典设计模式
经典的设计模式共 23 种
① 创建型模式,共 5 种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
② 结构性模式,共 7 种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式
③ 行为型模式,共 11 种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式
3.单例设计模式(static属性/方法经典使用场景 )
单例设计模式:采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
单例设计模式主要有以下三个特点:
① 只能有一个实例
② 必须自己创建自己的唯一实例
③ 必须给所有其他对象提供这一实例
3.1 饿汉式单例模式
① 特点:立即加载,类加载时就会把 single 创建完毕
② 优点:实现简单,不会有多线程安全问题
③ 缺点:当类加载时,会初始化 static 变量,静态变量被创建并分配内存空间。从这以后,这个 sttaic 的实例便一直占着这块内存,直到类被卸载时,静态变量被销毁,并解释所占用的内存空间。因此饿汉式单例模式在特定条件下会耗费内存
public class Test {
public static void main(String[] args) {
Singleton single1 = Singleton.getInstance();
Singleton single2 = Singleton.getInstance();
System.out.println(single1==single2);//true
System.out.println(single1);
System.out.println(single2);
}
}
//饿汉式单例模式
class Singleton {
private String name;
// 1.私有化构造器,防止直接在其他类new对象
private Singleton(String name) {
this.name = name;
}
// 2.内部提供一个当前类的实例
// 4.为了能够在静态方法getInstance中返回变量,single也必须静态化(静态方法只能调用静态属性/方法)
private static Singleton single = new Singleton("小马");
// 3.提供公共的静态的方法,返回当前类的对象
public static Singleton getInstance() {
return single;
}
@Override
public String toString() {
return "Singleton{" +
"name='" + name + '\'' +
'}';
}
}
3.2 懒汉式单例模式
先看代码,后面再总结
public class Test {
public static void main(String[] args) {
//single1和single2是同一对象
Singleton single1 = Singleton.getInstance();
Singleton single2 = Singleton.getInstance();
System.out.println(single1==single2);//true
System.out.println(single1);
System.out.println(single2);
}
}
//懒汉式单例模式
class Singleton {
// 1.私有化构造器
private Singleton() {
}
// 2.内部提供一个当前类的实例
// 4.此实例也必须静态化
private static Singleton single;
// 3.提供公共的静态的方法,返回当前类的对象
public static Singleton getInstance() {
if(single == null) {
single = new Singleton();
}
return single;
}
}
/*输出结果
true
Singleton@1b6d3586
Singleton@1b6d3586
*/
① 特点:延迟加载,只有在调用静态方法 getInstance 时 single 才被分配内存空间
② 优点:实现简单
(1)饿汉式在类加载时就创建了对象实例,但是可能这个对象后面没有用或者用的少,就造成浪费;
(2)懒汉式在类加载时 static 实例未被创建和分配内存空间,只有当静态方法 getInstance 第一次被调用时才返回对象,再次调用时,返回的也是上次调用的对象,因此保证了仅一个实例对象
③ 缺点:在多线程环境中,该实现方法存在线程安全问题,不能保证单例的唯一性
说明: 3 个线程同时进入 if 语句中,new 了 3 次,破环了单例设计模式的原则
4.补充
JavaSE 类库中,java.lang.Runtime 就是经典的单例模式,且是饿汉式的