设计模式-单例模式

Posted 乐碎碎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-单例模式相关的知识,希望对你有一定的参考价值。

 

一个类的静态属性只会在第一次加载类时初始化
静态变量只初始化一次
 
懒汉式方式:
 1 //懒汉式单例
 2 public class Singleton1 {
 3     // 4 定义一个变量存储创建好的类实例
 4     // 5 要在静态方法中使用,所以需要加上static修饰
 5     private static Singleton1 instance = null;
 6     //1 私有化构造函数,在内部控制创建实例的数目
 7     private Singleton1(){}
 8     // 2 定义一个方法为客户端提供类实例
 9     // 3 需要定义成类方法,加static
10     public static Singleton1 getInstance(){
11         // 6 判断存储实例的变量是否有值
12         if(instance == null){
13             // 6.1 如果没有,就创建一个类实例,赋给存储类实例的变量
14             instance = new Singleton1();
15         }
16         // 6.2 如果有值,就直接使用
17         return instance;
18     }
19 }
20 //没有经过内部类处理,这种方式最主要的缺点就是一旦我访问了Singleton1的任何其他的静态域,
21 //就会造成实例的初始化,而事实是可能我们从始至终就没有使用这个实例,造成内存的浪费

不加同步的懒汉式是线程不安全的。

 

//饿汉式单例
public class Singleton {
private static Singleton singleton = new Singleton();
    
    private Singleton(){}
    
    public static Singleton getInstance(){
        return singleton;
    }
}

饿汉式是线程安全的,因为虚拟机只会装载一次,在装载类的时候不会发生并发。

没有经过内部类处理,这种方式最主要的缺点就是一旦我访问了Singleton1的任何其他的静态域,就会造成实例的初始化,而事实是可能我们从始至终就没有使用这个实例,造成内存的浪费。

改成使用静态的内部类作为单例
public class Singleton {
    //1 私有化构造函数,内部控制创建实例的个数
    private Singleton(){}
    
    //2 定义方法为客户端提供类实例
    //3 需要定义成类方法,加static
    public static Singleton getIntance(){
        return SingletonInstace.instance;
    }
    
    //静态的内部类作为实例,一个类的静态属性只会在第一次加载类时初始化
    private static class SingletonInstace{
        static Singleton instance = new Singleton();
    }
}

 

以上是关于设计模式-单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块

设计模式之单例模式

设计模式之单例模式