关于单例模式及其Java实现
2019/08/18 19:11:28 来源:Linux社区 作者:ironHead-cjj

单例模式是23种设计模式中比较简单的一种,在此聊一下单例模式。

1.什么是设计模式?

  对于没有接触过设计模式的人来说,一听到设计模式这四个字就觉得这个东西很高深莫测,一下子就对这个东西产生了恐惧感,其实设计模式是那些大佬在项目经验中领悟出来并总结出来的套路,这些套路能够用于应对项目开发中的特定问题,所以设计模式并不可怕(其实心里慌得一批。。。)。设计模式一共有23种,根据用途来分类,可分为三类:

2.单例模式的作用

保证一个类只有一个实例,并且提供访问该实例的全局访问点

3.单例模式的应用场景

4.单例模式的实现方式(java)

4.1 饿汉式

package Singleton;
/**
 * 饿汉式单例模式
 * @author cjj
 */
public class Singleton01 {
    //在静态属性中创建实例
    private static Singleton01 instance=new Singleton01();
    //私有化构造器
    private Singleton01() {}
    //返回实例
    public static Singleton01 getInctance() {
        return instance;
    }
}

为啥这种实现方式称为饿汉式呢?因为这种实现方式是在静态属性中创建实例的,静态属性在类加载的时候就已经创建好实例了,这个时候还没有开始使用实例呢,所以很形象地称之为饿汉式实现(手动狗头程序员并不都是无趣的动物。。。),所以这种实现方式会造成内存的损耗。

4.2 懒汉式

package Singleton;
/**
 * 懒汉式单例模式
 * @author cjj
 *
 */
public class Singleton02 {
        //私有化构造器
    private Singleton02() {
    }
    private static Singleton02 instance;
    public static synchronized Singleton02 getInstance() {
        if(instance!=null) {
            instance=new Singleton02();
        }
        return instance;
    }
}

饿汉式的鲜明对比是懒汉式,这种实现方式是在调用时才创建实例。用买车票的比喻来说明这两种实现方式,饿汉式是属于那种第二天才出行,它在前一天就已经预定好车票了,而懒汉式这个家伙呢,在汽车出发前一分钟才买好票。与饿汉式相比,这种实现方式似乎比较合理,however,这种实现方式解决了饿汉式的缺点,也带来新的问题——会造运行速度慢一些。正所谓“没有最好的算法,只有适合的算法,空间复杂度与时间复杂度难两全!”

4.3 静态内部类创建实例

package Singleton;

/**
 * 用静态内部创建实例
 * @author cjj
 *
 */
public class Singleton04 {
   
    //用静态内部类来创建实例
    static class SingleInstance{
        public static final Singleton04 instance=new Singleton04();
    }
    //私有化构造器
    private Singleton04() {}
    //返回实例
    public static Singleton04 getInstance() {
        return SingleInstance.instance;
    }
   
}

这种实现方式结合了饿汉式和懒汉式两种方法的优点,即调用时加载类(静态内部类)并创建实例。

4.4枚举型创建单例

package Singleton;

public enum Singleton05 {
    INSTAANCE;
    public void Operation() {
       
    }
}

这种创建方式简单明了,在枚举类中设计就只有一个实例INSTAANCE,然后添加单例的操作就可以了,补充一下枚举型本质上也是属于一种类,每个枚举型都继承于java.lang.Enum<>类,所以枚举型也可以有成员方法的。这种方法避免了运用反射调用私有构造器来创建实例。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址https://www.linuxidc.com/Linux/2019-08/160196.htm


6

本栏最新