设计模式-单例模式

89 阅读4分钟
  1. 单例模式实现全局只有一个对象实例。

  2. 实现单例模式需要满足的条件:

    • 构造方法私有。
    • 用一个私有的,静态引用类型实例变量。
    • 提供一个公有的,静态方法来获得该实例。

对于单例设计模式实现的方式不只是这两种,等知识深入之后,我们再来进行优化。

模式,其实就是解决某一类问题的方法论,你把解决某类问题的方法总结归纳到理论高度那就是模式。 😮

不同的领域有不同的模式,像建筑领域有建筑模式,软件设计领域有设计模式,当一个领域逐渐成熟的时候,自然会出现很多模式。

经典的软件设计模式一共有 23 种,而本实验讲的单例模式是最简单的一种设计模式。 😊

单例设计模式,就是需要实现全局就一个对象实例

就像电脑键盘按下 Ctrl+Alt+Del 键打开的 Windows 任务管理器,无论如何我们都不能打开两个任务管理器,这就是说明,它在系统中只有单一的实例。

👉 要实现单例设计模式,创建的类需要满足以下 3 个条件:

  1. 构造方法私有。
  2. 用一个私有的,静态引用类型实例变量。
  3. 提供一个公有的,静态方法来获得该实例。

接下来,我们分成两种方式来实现单例设计模式。

第一种实现方式:懒汉式。

🤔 那什么叫懒汉式呢?

懒汉式就是延迟加载,所谓延迟加载就是调用提供公共的静态的方法时实例才被创建出来。

实现代码如下:👇

class Singleton1{
    // 私有的静态的引用类型变量
    private static Singleton1 s;

    // 私有的构造器
    private Singleton1(){

    }

    // 公共的静态的可返回该类的实例
    public static Singleton1 getInstance(){
        if(s == null){
            s = new Singleton1();
        }
        return s;
    }
}

创建一个独立的类 Singleton1 ,声明一个私有的静态的 Singleton1 类型的变量 s ;提供一个私有的构造方法,不允许其他类中直接通过 new 创建对象;提供一个公共的静态的返回 Singleton1 类型的 getInstance() 方法,在方法体中,当 s 为 null 时,通过 new 创建 Singleton1 的对象,进行传递。

在 /home/project/ 目录下,创建 TestSingleton.java 源文件,代码如下:

/**
 * 单例设计模式的使用
 * @author 小桃子
 */
public class TestSingleton{

    public static void main(String[] args){
        //Singleton1 s1 = new Singleton1();  不能直接创建对象
        Singleton1 s1 = Singleton1.getInstance();
    System.out.println(s1);
        Singleton1 s2 = Singleton1.getInstance();
    System.out.println(s2);
        System.out.println(s1 == s2);
    }
}
// 懒汉式
class Singleton1{

    // 私有的静态的引用类型变量
    private static Singleton1 s;

    // 私有的构造器
    private Singleton1(){

    }

    // 公共的静态的可返回该类的实例
    public static Singleton1 getInstance(){
        if(s == null){
            s = new Singleton1();
        }
        return s;
    }
}

如果想通过 new 直接创建 Singleton1 的对象,编译就会出错,如下图:

图片描述

我们只能通过 getInstance() 方法获取对象实例,运行结果如下图:

图片描述

我们可以从结果中看到,两个对象打印的地址完全相同。 第二种实现方式:饿汉式。

🤔 那什么叫饿汉式呢?

饿汉式就是立即加载,所谓立即加载就是使用该类的时候先将对象创建,不管以后会不会使用到该对象。

实现代码如下:👇

class Singleton2{

    // 私有的静态的最终的的引用类型的对象
    private static final Singleton2 S = new Singleton2();

    // 私有构造器
    private Singleton2(){

    }

    // 公共的静态的可返回该类的实例
    public static Singleton2 getInstance(){
        return S;
    }
}

创建一个独立的类 Singleton2 ,声明一个私有的静态的最终的 Singleton2 类型的常量 S,初始化赋值 new Singleton2() ,在此已经将对象创建好了,因为声明的是常量,所以其值不能改变;提供一个私有的无参的构造方法,外部不能通过 new 创建对象;提供一个公共的静态的返回 Singleton2 实例对象的 getInstance() 方法。

在已创建的 TestSingleton.java 源文件中加入,代码如下:

/**
 * 单例设计模式的使用
 * @author 小桃子
 */
public class TestSingleton{

    public static void main(String[] args){
        Singleton2 s3 = Singleton2.getInstance();
        Singleton2 s4 = Singleton2.getInstance();
        System.out.println(s3 == s4);
    }
}
// 饿汉式
class Singleton2{

    // 私有的静态的最终的的引用类型的对象
    private static final Singleton2 S = new Singleton2();

    // 私有构造器
    private Singleton2(){

    }

    // 公共的静态的可返回该类的实例
    public static Singleton2 getInstance(){
        return S;
    }
}

运行结果如下图:

图片描述