zoukankan      html  css  js  c++  java
  • 单例设计模式

    最近看了《大话设计模式》这本书,想在博客中记下以加深自己的印象。

    单例模式概述

    顾名思义,单例指的是:操作的类只能生成一个实例。
    应用场景:网站的计数器,日志文件应用,数据库线程池等。
    而在单例模式中,又分为饿汉单例模式懒汉单例模式。以下便通过代码展示出其区别。

    饿汉单例模式

    我们在通过Java获取一个对象时,一般是通过new调用类的构造函数生成,而当我们需要控制该类单例时,就需要将构造函数的访问权限设置为private以使得其他类无法通过构造方法创建实例,并给予一个类方法来获取Singleton类对象。

    //代码块一
    package com.singleton;
    
    public class Singleton {
        //饿汉单例模式,在调用该类的第一时间就创建了对象
        private static Singleton instance = new Singleton();
    
        private Singleton() {
        }
        
        //定义一个类方法, 需要使用到Singleton实例时调用该方法获取
        public static Singleton getInstance() {
            return instance;
        }
    }

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

    懒汉单例模式

    其他类需要使用Singleton的类对象时,只能通过类方法getInstance()获取到Singleton对象。

    //代码块二
    package com.singleton;
    
    public class Singleton {
        //懒汉单例:没有在调用该类的第一时间就创建一个对象, 而是在getInstance中根据条件创建
        private static Singleton instance;
    
        private Singleton() {
        }
    
        public static Singleton getInstance() {
            //只有当实例为空的时候才进行实例的创建
            if(instance == null)
                instance = new Singleton();
            return new Singleton();
        }
    }

    这种要在第一次被引用时,才会将自己实例化的类,称之为懒汉单例类。

    但是代码块二 在多线程的情况下,无法保证只生成一个对象,因此需要再修改为以下代码来确保多线程下只有一个对象。

    //代码块三
    package com.singleton;
    
    public class Singleton {
        //懒汉单例:没有在调用该类的第一时间就创建一个对象, 而是在getInstance中根据条件创建
        private static Singleton instance;
    
        private Singleton() {
        }
        //增加synchronized
        public synchronized static Singleton getInstance() {
            //只有当实例为空的时候才进行实例的创建
            if(instance == null)
                instance = new Singleton();
            return new Singleton();
        }
    }

    总结

    由于饿汉单例模式是在类一加载的时候就生成实例,所以要提前占用系统资源;
    懒汉单例模式又要面临着多线程访问的安全性问题,需要做到同步才可保证安全。

    才疏学浅,如文中有错误,感谢大家指出。

  • 相关阅读:
    JAVA LinkedList和ArrayList的使用及性能分析
    学习笔记—Node中的模块调试
    学习笔记—Node的核心模块
    学习笔记—Node中VM模块详解
    学习笔记—Node中require的实现
    入园了
    【引用】asp.net服务器推送(ServerPush)和客户端拉拽技术
    ajax xmlHttp.responseXML取不到值问题备忘
    oracle实时插值速度突然变慢问题解决办法
    [转帖 作者: fuyuncat 来源: www.HelloDBA.com ]Oracle IO问题解析
  • 原文地址:https://www.cnblogs.com/runningRookie/p/11108779.html
Copyright © 2011-2022 走看看