浅谈设计模式:单例模式(Singleton)

热爱生活、享受娱乐、专注技术,欢迎关注微信公众号QGer,我们一起见证成长!

什么是单例模式?

  • 一个类有且仅有一个实例,由系统自行实例化并通过一个全局访问点向整个系统提供。

为什么使用单例模式?

  • 节省内存,不需要在每次使用的时候都实例化一个对象出来
  • 一个实例全局提供重复利用
  • 某些环境下保证类有且只有一个实例非常重要,如:windows下任务管理器。

如何使用单例模式?

单例模式的写法千奇百怪,各种各种的写法都有,最终逃不过以下三个要点:

  • 有且仅有一个实例
  • 无需手动创建,系统自行实例化
  • 通过唯一一个全局访问点向整个系统提供使用

    此外不同环境下可能还会有不同要求:保证线程安全、保证序列化、反序列化时不产生多个实例、 多个类加载器加载时产生多个实例等等。

第一种实现:

public class Singleton {
    private static Singleton singleton = null;
    private Singleton(){
    }
    public static Singleton getInstance(){
         if(singleton == null){
             singleton = new Singleton();
        }
         return singleton ;
    }
}
 这一种单例的实例化是在需要用到时才进行实例化,但有明显的缺点:1、线程不够安全 2、每次使用都需要判断是否已经实例化,第一个缺点可以使用 synchronized 来声明 getInstance方法。第二个缺点可以使用第二种实现来避免。

第二种实现:

public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton(){
    }
    public static Singleton getInstance(){
         return singleton ;
    }
}
 这一种单例的实例化基于classloader机制,避免了多线程安全的方式,同时也不需要在实例每一次使用时判断是否已经实例化,属于最常用的方式。类似实现还可以使用静态块来进行单例的实例化,不要累述。

第三种实现:

public class Singleton {
    private static class SingletonHolder {
         private static final Singleton INSTANCE = new Singleton();
    }
    private Singleton (){}
    public static final Singleton getInstance() {
    return SingletonHolder. INSTANCE;
    }
}
 这一种实现Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。

第四种实现:

public enum  Singleton{
    SINGLETON;
     public void doWhatever(){};
}
 这一种实现使用枚举来实现,能避免多线程同步问题,还能防止反序列化重复创建对象的问题,但由于枚举是在jdk1.5才加入的新特性,因此目前还很少看到有人在实际项目中使用。

第五种实现:

public class Singleton {
    private volatile static Singleton singleton;
    private Singleton (){}
    public static Singleton getSingleton() {
        if (singleton == null) {
            synchronized (Singleton. class) {
            if (singleton == null) {
                singleton = new Singleton();
            }
            }
        }
        return singleton ;
    }
} 

已经被摒弃使用的一种写法,具体可戳….

http://blog.csdn.net/kufeiyun/article/details/6166673

此外,在阅读uncle bob 的一篇关于单例和“仅创建一个实例”的文章中,他提供了另一种可行的方式:

public class   Singleton {
     private Singleton(){}
     public static NonSingleton nonSingleton = newNonSingleton( new Singleton());
}
public class   NonSingleton {
     public NonSingleton(Singleton singleton) {
         assert (singleton != null);
    }
     public void doWhatever(){

    }
}
 这一种实现主要是因为uncle bob 认为单例模式自身违背了SRP(单一职责原则)即一个类只做一件事的原则,而他的这种实现即是将单例实例化、以及单例做的事情分割开来。
时间: 2024-08-10 19:03:40

浅谈设计模式:单例模式(Singleton)的相关文章

php设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 谷歌的Android设备 华为的Android设备 IOS只属于苹果公司 IOS只属于苹果公司 1 <?php 2 3 /* 4 * php

浅谈设计模式的学习(下)

时间过得真快啊,不知不觉又要周末了,借这个周末时间.把<浅谈设计模式的学习(下)>补上吧. 在<浅谈设计模式的学习(中)>中,说到了保持抽象的思维.接下来说一下第四点,做一个分享,也记录一下自己的学习历程. 4.学习设计模式,就不要把它看的太认真    设计模式是一个编程思想,它不是具体的代码套路.举个例子说明一下: 由于家传,接触到了一些中国的传统武术.当我与那些不懂传统武术的人交流的时候,他们总是认为中国的传统武术都是些套路.花架子,只是用来好看.在他们认为,两人打架,别人出拳

浅谈设计模式的学习(中)

在<浅谈设计模式的学习(上)>中我说到了设计模式的基石-----抽象思维.为什么需要抽象思维呢?因为越抽象就越不容易出错,就像有些领导人说话:坚持改革开放.但怎么算坚持改革开放呢,没有具体的标准,因事而异,所以就不容易违背这个坚持改革开放的原则了. 3.学习设计模式,要保持抽象的思维     什么是抽象思维呢?真的不好说,抽象的东西往往难以说明白,听了也难以搞明白,还是通过具体的例子来说吧 有这么一个学生请假的场景,如果请假时间一天以内则有班长批准就可以了,三天以内则需要老师批准,超过三天就得

浅谈设计模式1-策略模式

对于大多数面向对象的初学者来说,将思维模式从面向过程转变过来是一个比较困难的过程.很多人在用面向对象语言编写程序的时候,依然会感觉自己在用面向过程的思维,笔者分享这篇文章的用意便是希望可以对大家有一些积极的影响. 阅读本文可以是没有接触设计模式,但需要一定的面向对象基础,至少简单理解封装,继承多态. 对于刚开始接触设计模式来说,一开始就说概念性的东西,很少能够理解.所以我们可以先跳过这些,通过一个小的程序场景来进行一个比较直观的认识. 模拟魂斗罗发射子&弹 相信大家小的时候玩过一款叫魂斗罗的游戏

浅谈设计模式的学习(上)

作为一个开发人员,能写出一个漂亮可扩展的代码,绝对是一件令人愉快的事情.那设计模式就是一门必修课! 本文就自己学习设计模式的一点经历做一个记录. 本人在读大学时,为了学习设计模式就买了一本<java与模式>的数据,书籍有一千多页很重.而且价格不菲.没办法,花那么多钱买的不看岂不浪费.于是每天早上读一章,坚持几个月我终于读完了.这几个月真是煎熬啊,几个月下来,回忆一下似乎自己真得也没收获到什么,很悍然啊.难道是书籍不好吗还是我读的不认真?其实在我现在看来都不是.而为什么读完了却什么也没收获到呢?

浅谈设计模式3-模板方法模式

模版方法模式,个人认为还是用处比较多的一个设计模式,而且也是比较好学和理解的一个.依然来通过模拟一个场景来慢慢了解. 现在我们来实现一下泡茶这个过程.首先我们需要烧开一壶水,然后往茶壶中放茶叶,加入开水,等待茶泡好. 经过前两次的分享,大家应该具备了基本的面向对象的思想了,这里就不再用面向过程的方式演示了. 首先,有一种普通人,他泡茶的方式是这样的 public class Common     { public void MakeTea()         {             Heat

Java 设计模式 单例模式(Singleton) [ 转载 ]

Java 设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创建对象 第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 5 public static Singleton getInstan

Android设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

浅谈设计模式

米老师布置了作业,分析23种设计模式的异同,绞尽脑汁,冥思苦想还是认为初学设计模式,此问题过于高深实在不敢妄语.可是作业始终是要交的,只好浅谈一下设计模式,如理解有误,也算留下了一个底子,日后回头再看,这便是成长. 关于分类,设计模式分为三大类,分别为行为型,创建型,和状态型. 亦有几大原则,分别为:单一职责原则.开放-封闭原则.依赖导致原则.迪米特法则. 总体来说,不论什么模式,都是为了更好的发挥面向对象的思想,来加强类内部的内聚,来降低类与类之间的耦合,尽量做到"高内聚,低耦合",

【大话设计模式】——浅谈设计模式基础

初学设计模式给我最大的感受是:人类真是伟大啊!单单是设计模式的基础课程就让我感受到了强烈的生活气息. 个人感觉<大话设计模式>这本书写的真好.让貌似非常晦涩难懂的设计模式变的生活化.趣味化. 以下浅谈一下对设计模式基础的理解,假设理解的不好.还请大家指正. 首先设计模式是对面向对象的更专业的诠释.面向对象的三大基本特征是继承.封装.多态. 继承: 1.子类继承父类非private的属性和功能. 个人理解:有几个老婆是私有属性,小明他爸有好几个老婆.小明呢.恰好赶上了国家颁布法律一夫一妻 制(怎