zoukankan      html  css  js  c++  java
  • 浅谈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();
        }
    }
  • 相关阅读:
    引用传递函数值
    关于引用(python中的伪指针)的理解
    学生管理系统_排序后通过name删除列表里的字典
    学生管理系统(函数版)
    全局变量和局部变量的理解
    lambda隐藏函数的嵌套
    lambda函数常见用法
    函数的多个返回值
    函数的函数名重名
    函数的嵌套
  • 原文地址:https://www.cnblogs.com/IdealSpring/p/11871180.html
Copyright © 2011-2022 走看看