浅谈Java设计模式——单例模式(SingleCase)

一、概述

        单例模式主要是为了避免因为创建了多个实例造成资源的浪费,且多个实例由于多次调用容易导致结果出现错误,而使用单例模式能够保证整个应用中有且只有一个实例。

二、定义

定义:只需要三步就可以保证对象的唯一性

  • (1) 不允许其他程序用new对象
  • (2) 在该类中创建对象
  • (3) 对外提供一个可以让其他程序获取该对象的方法

对比定义:

  • (1) 私有化该类的构造函数
  • (2) 通过new在本类中创建一个本类对象
  • (3) 定义一个公有的方法,将在该类中所创建的对象返回

三、类图

                                

四、代码实现 

        单例模式中,由于创建类的时间不用又分为两种单例类懒汉式单例类饿汉式单例

懒汉式单例类:实例对象在第一次被调用时,才会将自己实例化,所以被形象的称之为懒汉式单例类。

/**
 * 单例模式——懒汉式单例类
 */
public class SingleCaseLazy {
    // 存放实例对象
    private static volatile SingleCaseLazy singleCaseLazy;

    // 私有化构造器,阻止被其他类new出来
    private SingleCaseLazy() { }

    // 外界通过此类获取本类对象
    public static SingleCaseLazy getInstance() {

        // 先判断实例是否存在,不存在再加锁处理
        if (singleCaseLazy == null) {
            // 在同一个时刻加了锁的那部分只有一个线程可以进入
            synchronized (SingleCaseLazy.class) {
                // 防止多线程情况下,线程都到达锁上等待时,等待完成进入再次创建实例
                if (singleCaseLazy == null) {
                    // 创建实例
                    singleCaseLazy = new SingleCaseLazy();
                }
            }
        }

        // 返回实例
        return singleCaseLazy;
    }

    public void description() {
        System.out.println("SingleCaseLazy Class successful......");
    }
}

饿汉式单例类:静态初始化方式在自己被加载时将自己实例化,所以被形象的称之为饿汉式单例。

/**
 * 单例模式——饿汉式单例类
 */
public class SingleCaseHungry {
    // 存放实例对象
    private static SingleCaseHungry singleCaseHungry = new SingleCaseHungry();

    // 私有化构造器
    private SingleCaseHungry() { }

    // 外界通过此类获取本类对象
    public static SingleCaseHungry getInstance() {
        // 返回实例
        return singleCaseHungry;
    }

    public void description() {
        System.out.println("SingleCaseHungry Class successful......");
    }
}

测试代码:

/**
 * 测试代码
 */
public class SingleCaseDemo {
    public static void main(String[] args) {
        // 懒汉式单例类
        SingleCaseLazy singleCaseLazy = SingleCaseLazy.getInstance();
        singleCaseLazy.description();

        // 饿汉式单例类
        SingleCaseHungry singleCaseHungry = SingleCaseHungry.getInstance();
        singleCaseHungry.description();
    }
}
原文地址:https://www.cnblogs.com/IdealSpring/p/11871180.html