设计模式——单例模式
单例模式是为了解决某些要确保对象的唯一性的问题存在的。
我举一个不恰当的例子,比如说许嵩这个人,这个对象。我先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对象会不会占用内存啥的。