设计模式——单例模式

 

 

  单例模式是为了解决某些要确保对象的唯一性的问题存在的。

  我举一个不恰当的例子,比如说许嵩这个人,这个对象。我先new出了一个许嵩,让他去唱歌去了。这个时候别人也new出了一个许嵩,让他旅游去了。那么现在许嵩的听众们想获取许嵩最近的状态,有的说许嵩在唱歌,有的说许嵩在旅游我们还合影了。这就造成了不统一的现象,造成了混乱。为了避免这种混乱,有效的解决方法只有一个,就是保证对象的唯一性!

  许嵩,只能有一个。这样无论他是在做菜还是在写歌还是在遛狗都是ok的,听众们在同一时间获取到的许嵩的行迹都是统一的。在Vae+发表的讨论帖子也是和谐的。

 

  我举了一个不是很恰当的例子,就是为了说明,在想要对象保持唯一性的时候,就要使用单例模式了。下面来看看代码

 

  例如,我写了一个类,叫Single。我现在可以随便的去new对象出来,例如:

package com.company;

public class Main {


    public static void main(String[] args) {
        System.out.println("大家好,我是Vae");

        Single s1=new Single();
        Single s2=new Single();
        Single s3=new Single();
        Single s4=new Single();

    }
}

class Single{

}

我直接new了4个对象出来,我很方的。怎么才能只让别人new一个对象出来,只使用一个对象去访问资源呢?可以这样写:

package com.company;

public class Main {


    public static void main(String[] args) {
        System.out.println("大家好,我是Vae");

        Single.getInstance().Print();

    }
}

class Single{

    private static final Single  m_instance=null;

    private Single(){}

    public static Single getInstance()
    {
        if ( m_instance== null) {
            m_instance=new Single();
        }
        return m_instance;
    }

    public void Print()
    {
        System.out.println("通过单例去调用我吧");
    }

}

其实,这就是单例模式了,由于我的构造函数是私有的,别人无论如何也不能去new对象了,只能乖乖的去调用getInstance方法去获取我的对象,这样就保证了我的对象的唯一性。

 

 关于单例模式,有一个饿汉式和懒汉式的区分,就是在于你是先加载对象,还是等你调用方法的时候再加载对象。如下图所示:

我写的例子是懒汉式的,这个其实无所谓,在实际开发的过程中,饿汉式其实用的比较多,因为单例模式你既然写了肯定是要用的,直接new出对象就ok了,不要担心什么先new对象会不会占用内存啥的。

 

posted @ 2018-10-07 16:46  蜀云泉  阅读(157)  评论(0编辑  收藏  举报