单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。
通过代码来看思想,先看这一段经常可以看到类似单例的。
package com.wanq.designmode.singleton;
/**
* @author-WanQ
* @创建时间:2013-3-24 下午12:32:28
* @类说明:
* 线程不安全的单例
*/
public class Singleton0 {
private static Singleton0 singleton = null;
private Singleton0(){
}
public static Singleton0 getInstance(){
if(singleton == null){
singleton = new Singleton0();
}
return singleton;
}
}
这段代码,实现了单例的要求,但是在存在并发的情况下,就可能会出问题。
接着看正确的单例
package com.wanq.designmode.singleton;
/**
* @author-WanQ
* @创建时间:2013-3-24 下午12:02:39
* @类说明:
* 安全的单例
*/
public class Singleton1 {
private static final Singleton1 instance = new Singleton1();
private Singleton1(){
}
public static Singleton1 getInstance(){
return instance;
}
public static void doSomething(){
}
}
应该还有其他好的方法,希望可以共享学习。
单例的场景是个思想,如果希望系统中存在一定数量的对象,譬如,数据库连接对象,IO处理对象,等等。所以我们接着看可以实例一定数量对象的单例如何实现:
package com.wanq.designmode.singleton;
import java.util.ArrayList;
import java.util.Random;
/**
* @author-WanQ
* @创建时间:2013-3-24 下午12:14:31
* @类说明:
* 多例
*/
public class Singleton2 {
// 定义产生多少个实例
private static int maxNumberOfSingleton = 2;
// 实例的名字
private static ArrayList<String> nameList = new ArrayList<String>();
// 容纳单例对象的列表
private static ArrayList<Singleton2> singletonList = new ArrayList<Singleton2>();
static{
for(int i=0; i<maxNumberOfSingleton;i++){
singletonList.add(new Singleton2("Singleton"+i));
}
}
private Singleton2(){
}
private Singleton2(String name){
nameList.add(name);
}
public Singleton2 getInstance(){
Random random = new Random();
int currNum = random.nextInt(maxNumberOfSingleton);
return singletonList.get(currNum);
}
}
单例就到这里了。继续学习。。。