单例模式简介
一、原理
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例
二、实例
1 /** 2 * 懒汉式(双重锁) 3 * 4 */ 5 class SingleTest1 { 6 //私有的静态属性 7 private static SingleTest1 instance = null; 8 9 //构造器私有化 10 private SingleTest1() { 11 } 12 13 //可供外部访问属性的方法,如果属性为null就创建一个 14 public static SingleTest1 getInstance() { 15 if (null == instance) { 16 synchronized (SingleTest1.class) { 17 if (null == instance) { 18 try { 19 Thread.sleep(1000); 20 } catch (InterruptedException e) { 21 // TODO Auto-generated catch block 22 e.printStackTrace(); 23 } 24 instance = new SingleTest1(); 25 } 26 } 27 } 28 return instance; 29 } 30 } 31 32 /** 33 * 饿汉式 34 * 35 */ 36 37 class SingleTest2 { 38 //私有的静态属性,并赋予初始值 39 private static SingleTest2 instance = new SingleTest2(); 40 41 //构造器私有化 42 private SingleTest2() { 43 } 44 45 //可供外部访问属性的方法 46 public static SingleTest2 getInstance() { 47 return instance; 48 } 49 } 50 51 /** 52 * 饿汉式改进版 53 * 54 */ 55 56 class SingleTest3 { 57 //私有的静态属性,并赋予初始值(还不需要返回值,只是调用该类其他方法时,不创建) 58 private static class result { 59 private static SingleTest3 instance = new SingleTest3(); 60 } 61 62 //构造器私有化 63 private SingleTest3() { 64 } 65 66 //可供外部访问属性的方法 67 public static SingleTest3 getInstance() { 68 return result.instance; 69 } 70 }
三、单例模式的优缺点
转自:http://blog.csdn.net/tayanxunhua/article/details/8250329
主要优点:
1、提供了对唯一实例的受控访问。
2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
3、允许可变数目的实例。
主要缺点:
1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
2、单例类的职责过重,在一定程度上违背了“单一职责原则”。
3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。