在23种设计模式中,单例模式算是最简单的一种设计模式,该模式只使用了面向对象中封装的概念,主要解决的是创建多个对象的问题。
单例模式,顾名思义,就是只允许创建一个单独的实例。可能有人会说,这么简单的事情根本不需要一种设计模式,使用该类的开发人员控制自己只创建一个实例不就行了吗?这种做法虽然很简单,但是,个人认为在面向对象的设计中,这种约束应该是类的设计者的责任,而不是使用者的责任。所以,这种设计模式就应运而生了。
单例模式很简单,也比较容易理解,下面是单例模式的类图:
下面是一个比较简单的单例模式实现的代码:
1 public class Singleton { 2 private static Singleton instance = null; 3 4 private Singleton() { } 5 6 public static Singleton getSingleton { 7 if( instance == null ) { 8 instance = new Singleton(); 9 } 10 return instance; 11 } 12 }
上面的代码只适合单线程的情况,如果在多线程的情况下,当第一个线程执行到第7行的时候,第二个线程也执行到这里,就会出现两个线程都判断instance为null,于是就会生成两个实例变量,不符合单例模式的要求。所以在多线程的情况下,需要对代码7 ~ 9行代码进行加锁,保证操作的原子性,下面是多线程情况的代码事例:
1 public class Singleton { 2 private static Singleton instance = null; 3 4 private String lockHelper; 5 6 private Singleton() { } 7 8 public static Singleton getSingleton { 9 synchronized( lockHelper ) { 10 if( null == instance ) { 11 instance = new Singleton(); 12 } 13 } 14 15 return instance; 16 } 17 }
单例模式的核心目的就是控制实例的创建数目为一个,所以在相应的扩展中,如果说需要控制实例的数目为n(n为固定的个数),将各种实例都存放在某个数组中,然后根据用户的需求轮询的返回对应的实例,可以说是建立了一个简单的对象池。下面是简单的代码事例:
1 public class Singleton { 2 private int n = 5; 3 private int count = 0; 4 private boolean created = false; 5 6 private static Singleton instance[] = new Singleton[n]; 7 8 private Singleton() { }; 9 10 private void initSingleton() { 11 for( int i = 0; i < n; ++i ) { 12 instance[i] = new Singleton(); 13 } 14 } 15 16 public Singleton getSingleton() { 17 if( !created ) { 18 initSingleton(); 19 created = true; 20 } 21 22 return instance[count++ % n]; 23 } 24 }
总体上来说,单例模式还是比较简单的设计模式,但是需要注意下面几点:
1、普通的单例模式在多线程的情况工作可能会出现不正常的情况,所以需要针对多线程的情况进行相应的修改。
2、实际的应用场景中,可能不是限制一个实例对象,而是限制创建n个,这种情况下,需要会对象池的含义以及使用。
3、需要理解单例模式的核心内容是“如何防止用户随意的使用new对某个类构造器的任意使用”,理解这个核心内容,也就理解了单例模式,并且能够根据具体的情况进行相应的变动。
原文:http://www.cnblogs.com/hanzejl/p/3590649.html