单例模式 (Singleton Pattern) 是最简单的设计模式之一。设计思想是确保一个类只有一个实例(对象)。
1.为了确保只有一个类只有一个实例就要私有化构造函数,防止new的出现;
2.类本身提供一个获取该类对象的方法,每次返回同一个对象;
单例模式大致分为两种类型:懒汉式,饿汉式;
废话不多说上代码:
package com.jde.jiangdeenleanpraent.design.single;public class Single { private Single singgle = null; /** * 私有化构造函数,防止new */ private Single() { } /** * 懒汉式,使用的时候才加载 * 在多线程情况下会有线程安全问题 */ public Single getSinggle() { if (null == singgle) { return new Single(); } return singgle; }
大家可能已经看出上面那段代码的问题了,在多线程情况下还是有可能创建多个对象,如果一个线程走到new Single();另一个线程已经进入if判断那就会产生多个对象。
现将代码改动如下:
/** * 懒汉式,多线程情况下线程安全,但是效率低 */ public synchronized Single getSyncSingle() { if (null == singgle) { return new Single(); } return singgle; }
现在看一下饿汉式的创建方式:
package com.jde.jiangdeenleanpraent.design.single;public class Single { private static final Single singgle = new Single(); /** * 私有化构造函数,防止new */ private Single() { } /** * 饿汉式,初始化就先new出一个对象,每次调用都返回同一对象 */ public Single getSingle() { return singgle; }
懒汉式的好处是,对象用的时候才生成,提升项目启动效率,如果不用不会占用内存。
饿汉式的好处是,效率高,但是在初始化的时候就生成对象,如果不用会占用内存,造成内存资源的浪费。