一个尴尬的年纪,没有儿时的勇气,年少的冲动,成熟的物质,消融了那些不切实际的臆想,也接受了很多难以为继的事实,一直在路上 。

23 种设计模式—单例模式

一、单例模式概述

  单例模式(Singleton-Pattern)是 Java 中最简单的设计模式之一,这种类型的设计模式属于对象创建型模式。

  作用:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

 

二、理解单例模式

  某些类创建对象是非常耗时耗内存和复杂的,这种类创建的对象我们称之为重量级对象(反之,轻量级对象),如果需要使用重量级类,一般把这个类设计为单例对象模式。

  单例对象模式好处有:

      1)保证对象在内存仅有一个,减少内存开销

      2)使用者不用考虑创建细节,使用方便

      3)可以控制对象的创建时刻

 

  代码实现单例模式的关键点:

    1)这个类在整个 JVM 中仅有一个对象实例

        Java 中对象的创建方式有:

          a)new 

          b)反射(reflect)

          c)反序列化(deserialize)

          d)克隆(clone)

    2)提供一个访问它的全局访问点

          a)公开的静态变量(不利于扩展)

          b)一个公开的静态方法,返回唯一实例

 

三、实现单例模式方式

  (1)饿汉式:立即创建、线程安全

 

package 饿汉式;

public class SingletonClass {
    
    //私有静态变量,创建唯一实例   final:避免再次赋值(可加可不加)
    private static final SingletonClass ONLY=new SingletonClass();

    //私有构造方法,屏蔽外部的 new(外部无法访问此类)
    private SingletonClass(){}
    
    //一个公开的静态方法,返回唯一实例,提供一个全局的访问点
    public static SingletonClass getInstance(){
        //...其他代码
        return ONLY;
    }
    
    public void f(){
        System.out.println("恶汉式单例模式");
    }
}

 

  

  (2)懒汉式:延时创建、线程不安全

package 懒汉式;

public class SingletonClass {
    
    //私有静态变量,保存唯一实例
    private static  SingletonClass ONLY;

    //私有构造方法,屏蔽外部的 new(外部无法访问此类)
    private SingletonClass(){}
    
    //一个公开的静态方法,返回唯一实例,提供一个全局的访问点
    public  static SingletonClass getInstance(){
        if(ONLY==null){
            //...线程不安全
            ONLY=new SingletonClass();
        }
        //...其他代码
        return ONLY;
    }
    
    public void f(){
        System.out.println("懒汉式单例模式");
    }
}

//缺点:多线程情况下不安全

 

  (3)加锁的懒汉式:延时加载、线程安全、同步情况下效率低

package 加锁懒汉式;

public class SingletonClass {
    
    //私有静态变量,保存唯一实例
    private static  SingletonClass ONLY;

    //私有构造方法,屏蔽外部的 new(外部无法访问此类)
    private SingletonClass(){}
    
    //一个公开的静态方法,返回唯一实例,提供一个全局的访问点
    public synchronized static SingletonClass getInstance(){
        if(ONLY==null){
            //...线程不安全(解决方案:synchronized)
            ONLY=new SingletonClass();
        }
        //...其他代码
        return ONLY;
    }
    
    public void f(){
        System.out.println("加锁懒汉式单例模式");
    }
}

//缺点:同步情况下效率低,即当
SingletonClass 的对象已经被创建,多线程情况下因为有 synchronized 存在,还需要等待解锁。

 

 

 

 

eclipse 中字母大小写转换快捷键:

    ctrl+shift+x   转为大写  

       ctrl+shift+y   转为小写

 

posted @ 2018-10-08 01:26  斯文败类i  阅读(267)  评论(0编辑  收藏  举报