设计模式(21)-----单例模式

单例模式(singleton)

定义

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

例子

  第一种方法

package com.csdhsm.pattemdesign.singleton;

/**
 * @Title:  Singleton1.java
 * @Description: 第一种方法,只适用于当线程,在多线程时不安全
 * @author: Han
 * @date:   2016年6月27日 上午10:37:07
 */
public class Singleton1 {

    private static Singleton1 singleton;

    public static Singleton1 getInstance() {

        if(singleton == null) {
            singleton = new Singleton1();
        }
        return singleton;
    }
}

  第二种方法

package com.csdhsm.pattemdesign.singleton;

/**
 * @Title:  Singleton2.java
 * @Description: 第二种方法,在多线程下安全,但是同步锁是一个非常耗时的操作,该方法效率低
 * @author: Han
 * @date:   2016年6月27日 上午10:39:09
 */
public class Singleton2 {

    private static Singleton2 singleton;

    public static Singleton2 getInstance() {
        //添加同步锁,避免线程不安全
        synchronized (singleton) {
            if(singleton == null) {
                singleton = new Singleton2();
            }
        }
        return singleton;
    }
}

  第三种方法

package com.csdhsm.pattemdesign.singleton;

/**
 * @Title:  Singleton3.java
 * @Description: 第三种方法,双重if判断,一旦对象实例化之后,就不会再进入同步锁,大大提高效率,但是该代码略显复杂
 * @author: Han
 * @date:   2016年6月27日 上午10:41:31
 */
public class Singleton3 {

    private static Singleton3 singleton;

    public static Singleton3 getInstance() {
        if(singleton == null) {
            synchronized (singleton) {
                if(singleton == null) {
                    singleton = new Singleton3();
                }
            }
        }
        return singleton;
    }
}

  第四种方法

package com.csdhsm.pattemdesign.singleton;

/**
 * @Title:  Singleton4.java
 * @Description: 第四种方法,典型的饿汉加载,在类初始化的时候,就实例化对象,这种方法不会存在线程安全,
 *                    但是,当类中有另外一个static方法被访问,将会引起jvm去初始化instance,最明显的
 *                    缺点就是如果构造器内的方法比较耗时,则加载过程会比较长。
 * @author: Han
 * @date:   2016年6月27日 上午10:43:43
 */
public class Singleton4 {

    private static Singleton4 singleton = new Singleton4();

    public static Singleton4 getInstance() {
        return singleton;
    }
}

  第五种方法

package com.csdhsm.pattemdesign.singleton;

/**
 * @Title:  Singleton5.java
 * @Description: 第五种方法,引入一个中间容器,当调用Singleton5中的其他static方法的时候,
 *                  instance不会急着实例化,而是等使用的时候,如果SingletonHolder类没有被加载,就会去加载,
 *                    起到延迟加载的作用,所以这种方法是懒汉单例,而且没有使用到synchronized同步块。
 * @author: Han
 * @date:   2016年6月27日 上午10:46:38
 */
public class Singleton5 {

    private static class SingletonHolder{

        static Singleton5 singleton5 = new Singleton5();
    }

    private Singleton5(){};

    public Singleton5 getInstance(){

        return SingletonHolder.singleton5;
    }
}

总结

  如果是比较简单的单例类设计,对于一般的应用,构造方法内的代码不涉及到读取配置、远程调用、初始化IOC容器等长时间执行的情况,则可以使用第四种加载方法。相反,则需要使用第五种实例方法,当使用的时候才去实例化,延缓加载。

时间: 2024-10-09 11:42:31

设计模式(21)-----单例模式的相关文章

笔记-大话设计模式-21 单例模式

所有类都有构造方法,不编码则系统默认生成空的构造方法,若有显式定义的构造方法,默认的构造方法就会失效. 单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点. Demo1: sealed class Singleton { private static readonly Singleton instance = new Singleton(); private Singleton() { } public static Singleton GetInstance(

C#设计模式(1)——单例模式

一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计模式>,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考.首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二.单例模式的介绍 说到单例模式,大家第一反应应该就是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有一个实例,所以单例模式也就是保证一个类只

设计模式(1)单例模式

程序中有时候需要保存全局的数据,比如程序的配置文件,需要随时检索的.比如程序中有些变量需要全局保存全局用,这时候我们不想用一个全局变量来保存 这时候,可以使用单例模式,从名称可以看出,单例模式就是类的实例全局只创建一个.怎么样才能保存只创建一个实例呢? 我们可以设置标识位,创建过的就不再创建了.下面是单例的简单实现 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

Java设计模式之——单例模式

一.什么叫单例模式 JVM所管理的内存也就是堆中只存在某个类的唯一一个实例,通过把构造函数私有化,然供一个静态方法提供唯一实例.单例模式经常被分为饿汉单例模式以及懒汉单例模式.饿汉单例模式是在类初始化的时候创建自己的实例.懒汉模式是在需要实例的时候再创建实例. 二.单例模式优点与缺点 优点:内存中只存在一个实例所以减少了内存开销,针对一些创建和销毁对象时开销比较的情况单例模式可以减小系统性能开销. 缺点:多线程下并发问题. 三.单例模式在jvm垃圾回收的时候的处理 在网上看到有人提到了关于单例模

设计模式之单例模式20170711

创建型设计模式之单例模式 一.含义 在一个进程或者线程里,对于一个类只有一个实例化对象,即内存中只有一个实例化对象 二.代码说明 由于是单例模式,只有一个对象,所以该类内部都是静态常量和静态方法, 具体来说,因为只有一个对象不能创建多个对象,创建对象就没什么意义了(直接用类表示对象即一个类就是一个对象),所以类内部都是静态的,不需创建就可使用(而且由于是静态的也确保每次调用都是属于类的内存空间,即只占一份内存空间也就是一个对象的内存空间) 在用C实现过程中也是参考这种思想,直接构造一个类的对象

设计模式之单例模式的简单demo

1 /* 2 * 设计模式之单例模式的简单demo 3 */ 4 class Single 5 { 6 /* 7 * 创建一个本类对象. 8 * 和get/set方法思想一样,类不能直接调用对象 9 * 所以用private限制权限 10 */ 11 private static Single s = new Single(); 12 /* 13 * 构造函数私有化目的是为了只能产生一个对象 14 */ 15 private Single(){} 16 // 定义一个方法返回该对象,让外部可以调

php设计模式:单例模式

前些日子开始着真正的去了解下设计模式,开始么,简单地从单例模式开始,当然网上看了一些资料,单例模式比较好理解,看看介绍,然后看看代码基本也就能够理解了,设计模式这些的花点心思基本的是能够理解的,当然要想很好的运用到项目上也是需要一定的实践,不能只是知道了解,或者说的是很厉害很懂的,一到要实际操作就不行了,废话就不多说了,PHP战线上的同志们都加油吧:单例模式(职责模式):简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务:单例类:1.构造函数需要标记为priv

Java常用的设计模式03:常用设计模式之单例模式

1.java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能有一个Printer

C#设计模式之一单例模式(Singleton Pattern)【创建型】

原文:C#设计模式之一单例模式(Singleton Pattern)[创建型] 一.引言 看了李建忠老师的讲的设计模式已经有一段时间了(这段时间大概有一年多了),自己还没有写过自己的.有关设计模式的文章.这次想写一些关于设计模式的文章,用自己的理解和代码来写,算是复习一遍.写作的过程中也会多看看其他大牛的文章,争取让自己的理解正确,否则把大家带跑偏了,就是我的过错了.今天就开始我们第一个设计模式,该模式是:[单例模式],英文名称:Singleton Pattern,这个模式很简单,一个类型只需要