一,单例模式,运用比较广泛,在这里就例举几种
在java中对象的创建方式总共有四种,1,new创建 2,反射机制创建 3,clone创建 4,对象序列化创建.
只要知道了这几种的创建方式,设置其创建方式即可.
使用:单例模式可以是有状态也可以是无状态的,有状态的应用在于,如定义一全局变量,产生一个系列号等,无状态,犹如工具类使用,如(servlet/calendar.getInstance()/Runtime.getRuntime...)
1,如果要使一个类的创建方式只有一种,可.
public class Singleton {
private static final Singleton singleton=new Singleton();
private Singleton(){}
public static Singleton getHandle(){
return singleton;
}
}
2,
public class Singleton2 {
private static Singleton2 singleton2;
private Singleton2() {
}
// 同步的原因是,防止多线程时,可以创建多个实例
public synchronized static Singleton2 getHandle() {
if (singleton2 == null) {
singleton2 = new Singleton2();
}
return singleton2;
}
}
大多数情况下是使用以上两种进行判断,但是根据不一样的业务条件就有不一样的设计...
public class Singleton4{
static class SingletonHolder{
public static Singleton4 instance=new Singleton4();
}
public Singleton4 getInstance(){
return SingletonHolder.instance;
}
}
可以以一个集合的方式统一管理系统里我们要运用的单例...
public class Singleton3 {
/**
* 可以被继承 这种设计方式,map提供了扩展性 map可以是一个properties文件,在里面一配置,根据类名就可以 获取到相应类的单例子。
*/
protected Singleton3() {
}
private static Map map_register = new HashMap();
static {
Singleton3 sl3 = new Singleton3();
map_register.put(sl3.getClass().getName(), sl3);
}
public static Object getInstance(String name) {
if (name == null) {
name = "com.wqy.single.Singleton3";
}
if (map_register.get(name) == null) {
try {
map_register.put(name, Class.forName(name).newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
return map_register.get(name);
}
}
对于对象的流写入与读取要实现一个
private Object readResolve() throws ObjectStreamException {
return INSTANCE;
}
这样在读取时,不会重新创建一个对象.