设计模式之单例模式

题外话

写代码:

1,明确需求——我要做什么?

2,分析思路——我要怎么做?1,2,3。

3,确定步骤——每一个思路部分用到哪些语句,方法,和对象。

4,代码实现——用具体的java语言代码把思路体现出来。

学习新技术的四点:

1,该技术是什么?

2,该技术有什么特点(使用注意):

3,该技术怎么使用。demo

4,该技术什么时候用?test。

这是网上看到的觉得很贴合实际就码下来了


概念:   java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍常用的两种:懒汉式单例、饿汉式单例。

饿汉式和懒汉式区别

从名字上来说,饿汉和懒汉,

饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,

而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。

由于LZ现在是初学者,详细概念不深。

具体的,推荐博文:JAVA设计模式之单例模式可以去看看

思想

1,不让其他程序创建该类对象。

2,在本类中创建一个本类对象。

3,对外提供方法,让其他程序获取这个对象。

步骤

1,因为创建对象都需要构造函数初始化,只要将本类中的构造函数私有化,其他程序就无法再创建该类对象;

2,就在类中创建一个本类的对象;

3,定义一个方法,返回该对象,让其他程序可以通过方法就得到本类对象。(作用:可控)

代码体现

1,私有化构造函数;

2,创建私有并静态的本类对象;

3,定义公有并静态的方法,返回该对象。

饿汉式

//单例模式之饿汉模式
public class Singleton {
    //1、将构造方法私有化,不允许外部直接创建对象
    private Singleton(){
    }
    
    //2、创建类的唯一实例
    private static Singleton instance = new Singleton();
    
    //3、提供一个用于获取实例的方法。使用public static修饰
    public static Singleton getInstance(){
        return instance;
    }
}

懒汉式

//单例模式之懒汉式,延迟加载
public class Singleton2 {

    //1.将构造方式私有化,不允许外部直接创建实例对象
    private Singleton2(){
    }
    //2.声明类的唯一实例,使用private static修饰
    private static Singleton2 instance;
    //3.提供一个用于获取实例对象的方法
    public static Singleton2 getInstance(){
        if(instance == null){
            instance = new Singleton2();
        }
        return instance;
    }
}

对于线程安全方面:(详细自行百度

饿汉单例模式加载类时比较慢,获取对象速度快。线程是安全的。

懒汉单例模式加载快,获取对象速度相对慢。线程是不安全的。

测试:

public class Test {

    public static void main(String[] args) {
        //饿汉模式
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        if(s1 == s2){
            System.out.println("s1和s2是同一个实例");
        }else{
            System.out.println("s1和s2是不是同一个实例");
        }
        
        //懒汉模式
        Singleton2 s3 = Singleton2.getInstance();
        Singleton2 s4 = Singleton2.getInstance();
        if(s3 == s4){
            System.out.println("s31和s4是同一个实例");
        }else{
            System.out.println("s3和s4是不是同一个实例");
        }
    }
}

输出结果:

s1和s2是同一个实例
s31和s4是同一个实例

 

原文地址:https://www.cnblogs.com/himonkey/p/7596600.html