Java常见的4种设计模式——单例模式

【Java常见的4种设计模式——单例模式】java的四种设计模式:
一.单例模式
(一)饿汉模式
(二)懒汉模式
1.非线程安全
2.线程安全
(1)普通锁模式
(2)双重锁模式(既安全,又能提高效率)
二.模版模式
三.装饰模式
四.工厂模式
这四种模式是个人理解,如有不对之处,大家可以指出。
一.单例模式(一次只能创建一个对象)
(一)饿汉模式
步骤:
1.初始化一个私有的对象。
2.建立私有化构造方法,不让外部直接创建对象。
3.建立一个公有方法,暴露给外部调用。该公有方法直接返回私有的对象。
4.通过类名直接调用该公有方法。

/** * 单例设计模式: *饿汉设计模式 */ public class singleInstance { private static singleInstance instance = new singleInstance(); private singleInstance(){}; //该方法用于暴露给外部调用 public static singleInstance getInstance(){ return instance; } } public class singleInstanceDemo { public static void main(String[] args) { singleInstance instance = singleInstance.getInstance(); } }

(二)懒汉模式
步骤:
1.创建私有对象,但不初始化,什么时候用,什么时候再初始化,太懒了,但能节省内存,提高效率。
2.建立私有化构造方法,不让外部直接创建对象。
3.建立一个公有方法,暴露给外部调用。该公有方法直接返回私有的对象。
4.通过类名直接调用该公有方法
种类:
1.非线程安全
/** * 单例设计模式: *懒汉设计模式(非线程安全) */ public class singleInstance { //这里不初始化 private static singleInstance instance; private singleInstance(){}; //该方法用于暴露给外部调用 public static singleInstance getInstance(){ if(instance == null){ singleInstance instance = new singleInstance(); } return instance; } } public class singleInstanceDemo { public static void main(String[] args) { singleInstance instance = singleInstance.getInstance(); } }

2.线程安全
(1)普通锁模式
/** * 单例设计模式: *懒汉设计模式(线程安全 普通锁模式) */ public class singleInstance { //这里不初始化 private static singleInstance instance; private singleInstance(){}; //该方法用于暴露给外部调用 public static synchronized singleInstance getInstance(){ if(instance == null){ singleInstance instance = new singleInstance(); } return instance; } } public class singleInstanceDemo { public static void main(String[] args) { singleInstance instance = singleInstance.getInstance(); } }

(2)双重锁模式(既安全,又能提高效率)
/** * 单例设计模式: *懒汉设计模式(线程安全 双锁模式) */ /** * 单例设计模式: *懒汉设计模式(线程安全 双锁模式) */ public class singleInstance { //这里不初始化 private static singleInstance instance; private singleInstance(){}; //该方法用于暴露给外部调用 public static singleInstance getInstance(){ if(instance == null){//这个if语句看似多余,其实是为了提高效率,提早阻隔不满足条件的进程进入。 synchronized (singleInstance.class){ if(instance == null){//这个if语句的作用是保证单例。如果没有该句,那么Thread1和Thread2都可能进来,创建多个对象。 singleInstance instance = new singleInstance(); } } } return instance; } }public class singleInstanceDemo { public static void main(String[] args) { singleInstance instance = singleInstance.getInstance(); } }

    推荐阅读