• java的单例设计模式


         单例设计模式是java的一种设计模式,它是指在设计一个类时,要保证在整个程序运行期间针对该类内存中只存在一个实例对象。

         单例设计模式包括饿汉式和懒汉式两种模式。

         饿汉式:类一加载进内存就创建好了对象;

         饿汉式的代码如下:

    package com.sjk.sheng;
    
    /**
     * 单例模式之饿汉式
     * @author sjk
     *
     */
    public class Single {
        //将构造函数私有化,不让别的类建立该类对象
        private Single(){}
        //自己建立一个对象
        private static final Single s = new Single();
        //提供一个公共访问方式
        public static Single getInstance() {
            return s;
        }
    }

         懒汉式:类加载进内存的时候,对象还没有存在,只有调用了getInstance()方法时,对象才开始创建。

         懒汉式的代码如下:

    package com.sjk.sheng;
    
    /**
     * 单例模式之懒汉式
     * @author sjk
     *
     */
    public class Single {
        private Single(){} 
        private static Single s;
        public static Single getInstance() {
            if(s==null)
                //如果对象为空就创建一个
                s=new Single();
            return s;
        }
    }

         懒汉式是延迟加载,如果多个线程同时操作懒汉式时就有可能出现线程安全问题,解决线程安全问题可以加同步来解决。但是加了同步之后,每一次都要比较锁,效率就变慢了,所以可以加双重判断来提高程序效率。

         如将上述懒汉式的Instance函数改成同步:

    package com.sjk.sheng;
    
    /**
     * 单例模式之懒汉式线程安全问题的解决方案
     * 
     * @author sjk
     * 
     */
    public class Single {
    
        // 声明本类的一个私有的成员变量
        private static Single single;
    
        // 第一步 : 私有化构造方法
        private Single() {
    
        }
    
        // 第三步:提供一个公共的方法获取该类的实例对象
        public static Single getInstance() {
            if (single == null) {
                synchronized (single) {
                    if (single == null) {
                        single = new Single();
                    }
                }
            }
            return single;
        }
    }

         以上通过饿汉式和懒汉式实现了单例模式,它具备如下的特点:

         1)类的构造方法使用private修饰,声明为私有,这样就不能在类的外部使用new关键字来创建实例对象了。

         2)在类的内部创建一个该类的实例对象,并使用静态变量s引用该对象,由于变量应该禁止外界直接访问,因此使用private修饰,声明为私有成员。

         3)为了让类的外部能够获得类的实例对象,需要定义一个静态方法getInstance(),用于返回该类的实例s。由于是静态的,外部可以通过“类名.方法名”的方式来访问。

         因此饿汉式的单例模式也可以写成以下形式:

    package com.sjk.sheng;
    
    /**
     * 单例模式之饿汉式的另一种形式
     * @author sjk
     * 
     */
    public class Single {
        private Single() {}
        public static final Single s = new Single();
    }

         在上面代码中,首先将该类的构造方法私有化,防止外界创建该类的实例。在该类的内部创建了该类的实例对象,并使用静态变量s来引用,变量s的前面有三个修饰符,其中,public的作用是允许外部直接访问该变量,static的作用是让外部可以使用“类名.变量名”的方式来访问变量,final的作用是禁止外部对该变量进行修改。由于访问变量s是获得Single类实例对象的唯一途径,因此该类实现了单例。

  • 相关阅读:
    Google Map API Version3 :代码添加和删除marker标记
    ArcGIS Server开发教程系列(8)ArcGIS API for Javascript-控件(小部件)
    ArcGIS Server开发教程系列(8)ArcGIS API for Javascript-控件(小部件)(续)纯代码
    ArcGIS Server开发教程系列(7)使用ArcGIS API for Javascript-Hello World
    ArcGIS Server开发教程系列(3)切片
    3.1、常用图片格式
    【Emmet】HTML速写之Emmet语法规则
    2.11、特征布局实例讲习
    2.10、background属性
    2.9、定位
  • 原文地址:https://www.cnblogs.com/sheng-sjk/p/7622975.html
Copyright © 2020-2023  润新知