理清Java23种设计模式之单例模式

本文系作者原创,如需转载请注明出处!
https://zhuanlan.zhihu.com/p/23713957?refer=dreawer

一、概述

其实我是很讨厌写博客啥的,反而写笔记、总结会更有兴趣。刚开始我是拒绝的,不过既然已经开了头,那我就写个系列吧!设计模式,常用的就有23种,如下图(图片来自:终点

java设计模式
java设计模式

是不是很缭乱?是的,我开始是懵逼的,现在还是懵逼状态。不过不要紧,我们虽然是菜鸟,但也是会终究成为大神的,我跟着大家一起学习进步。
这篇写的是23种设计模式中的一种——单例模式

1、什么是单例模式?

百度百科是这样定义的:单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例

我是这样理解的:单例模式就是只允许一个实例,最开始使用它的时候是C#中,我要实例化一个A窗体,但是有个需求就是A窗体必须是唯一,不管我在B窗体操作A窗体还是C窗体中操作A窗体都是如此,这时候就使用到了单例模式

2、单例模式分类

  • A、懒汉单例模式:在第一次调用的时候实例化本身,在并发环境下,可能出现多个本身对象。所以线程是不安全的
  • B、饿汉单例模式:在类初始化时,已经自行实例化一个静态对象,所以本身就是线程安全的
  • C、登记单例模式:通过一个专门的类对各单例模式的单一实例进行管理和维护

3、特点

  • A、 单例模式类只能有一个实例
  • B、 单例模式类必须自己创建自己的唯一实例
  • C、 单例模式类必须给所有其他对象提供这一实例

二、运用

1、懒汉单例模式

/**
* 描述:懒汉单例模式<p> 
* 作者: kimball <p>
* E-mail: kimballlu@foxmail.com <p>
* 日期:2016-11-16 下午4:30:32 <p>
*/public class Singleton {
    
    /**
     * 该函数限制用户主动创建实例
     */
    private Singleton() {}
    private static Singleton singleton = null;
    
    /**
     * 获取Singleton实例(也叫静态工厂方法)
     * @return Singleton
     */
    public static Singleton getSingleton() {
        /* 当singleton为空时创建它,反之直接返回,保证唯一性 */
        if(singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
    }

线程安全的懒汉单例模式
在getSingleton()添加synchronized同步

/**
 * 描述:懒汉单例模式,在getSingleton()方法添加同步<p>
 * 作者: kimball <p>
 * E-mail: kimballlu@foxmail.com <p>
 * 日期:2016-11-16 下午4:30:32 <p>
 */
public class Singleton {
    
/**
     * 该函数限制用户主动创建实例
     */
    private Singleton() {}
    private static Singleton singleton = null;
    /**
     * 获取Singleton实例,也叫静态工厂方法
     * @return Singleton
     */
    public static synchronized Singleton getSingleton(){
        if(singleton==null){
            singleton=new Singleton();
        }
        return singleton;
    }
    
}

双重检查锁定
ps:已修正,仍不推荐使用,感谢@江南布衣指正
具体可参考正确使用双重检查锁定双重检验锁失效”的问题说明

/**
 * 描述:懒汉单例模式 ,双重检查锁定<p>
 * 作者: kimball <p>
 * E-mail: kimballlu@foxmail.com <p>
 * 日期:2016-11-16 下午4:30:32 <p>
 */
public class Singleton {

    /**
     * 该函数限制用户主动创建实例
     */
    private Singleton() {}

    private volatile static Singleton singleton = null;

    /**
     * 获取Singleton实例,也叫静态工厂方法
     * @return Singleton
     */
    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }

}

静态内部类:静态内部类比双重检查锁定和在getInstance()方法上加同步都要好,实现了线程安全又避免了同步带来的性能影响

/**
 * 描述:懒汉单例模式 ,静态内部类<p>
 * 作者: kimball <p>
 * E-mail: kimballlu@foxmail.com <p>
 * 日期:2016-11-16 下午4:30:32 <p>
 */
public class Singleton {

    /**
     * 静态内部类
     * @author kimball
     *
     */
    private static class LazyHolder {
        // 创建Singleton实例
        private static final Singleton INSTANCE = new Singleton();
    }

    /**
     * 该函数限制用户主动创建实例
     */
    private Singleton() {}

    /**
     * 获取Singleton实例,也叫静态工厂方法
     * @return Singleton
     */
    public static final Singleton getInstance() {
        return LazyHolder.INSTANCE;
    }

}

2、饿汉单例模式

/**
 * 描述:饿汉单例模式<p>
 * 作者: kimball <p>
 * E-mail: kimballlu@foxmail.com <p>
 * 日期:2016-11-16 下午4:30:32 <p>
 */
public class Singleton {

    /**
     * 该函数限制用户主动创建实例
     */
    private Singleton() {}

    private static final Singleton singleton = new Singleton();

    /**
     * 获取Singleton实例,也叫静态工厂方法
     * @return Singleton
     */
    public static Singleton getInstance() {
        return singleton;
    }

}

3、登记单利模式


/**
 * 描述:登记单例模式<p>
 * 作者: kimball <p>
 * E-mail: kimballlu@foxmail.com <p>
 * 日期:2016-11-16 下午4:30:32 <p>
 */
public class Singleton {

    // 存储需要进行维护和管理的类的实例
    private static Map<String, Singleton> map = new HashMap<String, Singleton>();
    
    /**
     * 静态创建实例并添加到Map集合
     */
    static {
        Singleton singleton = new Singleton();
        map.put(singleton.getClass().getName(), singleton);
    }

    /**
     * 该函数限制用户主动创建实例
     */
    private Singleton() {};

    /**
     * 获取Singleton实例,也叫静态工厂方法
     * @return Singleton
     */
    public static Singleton getInstance(String name) {
        /* 根据指定的类的名称从mao中获取实例并返回 */
        return map.get(name);
    }

    // 一个示例性的商业方法
    public String about() {
        return "你好,我是RegSingleton";
    }

    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance("com.Singleton");
        System.out.println(singleton.about());
    }

}

三、结语

以上就是单例设计模式,虽然单例设计模式是23种设计模式种比较简单的设计模式。但是三个臭皮匠也能顶一个诸葛亮,它自然有它存在的道理。

设计模式说白点就是编码的一种思维(之前在学校老师一个劲儿的说思维思维,现在我也开始说,手动滑稽)

我是以生活的角度去看待编码,编码就是世界的缩小版

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容