最优的单例模式,设计如下:
-
public class Singleton{
-
public static Singleton instance = new Singleton();
-
-
public static Singleton getInstance() {
-
return instance;
-
}
-
-
private Singleton() {
-
}
-
}
但是我今天在面试的时候面试官提问说,如果要求在Singleton构造函数中传递参数,又该怎么设计呢?
于是我毫不犹豫地写成如下设计:
-
public class Singleton{
-
public static Singleton instance = null;
-
-
public synchronized static Singleton getInstance(Object ...params) {
-
if(instance == null) {
-
instance = new Singleton(params);
-
}
-
return instance;
-
}
-
-
private Singleton(Object ... params) {
-
// do somthing
-
}
-
}
自以为还不错呢,但是面试说这个设计不好,因为每一次获取单例对象的时候,线程都需要获取对象锁。那如何解决这个问题呢?
我当时没有什么好的思路,所以感觉面试打了不少折扣。
回来仔细思考了哈,其实这个问题的处理:
首先,确定单例模式的设计一定需要往构造函数里传递参数吗?
其次,如果一定需要往单例对象的构造函数里传递参数的话,不用线程同步的方式可以实现吗?
在我面试时面试官提出的需求是需要以传递参数的方式初始化一些配置信息,于是在想,可不可以将配置信息写入文件中在类加载的时候读取然后实例化单例对象呢?设计如下:
-
public class Singleton{
-
public static String conf = "path";
-
public static Singleton instance = null;
-
-
static {
-
// 读取配置文件中的参数
-
// read params
-
syncronized(Singleton.class) {
-
if(instance == null) {
-
instance = new Singleton(params);
-
}
-
}
-
}
-
-
public static synchronized Singleton getInstance(Object ...params) {
-
return instance;
-
}
-
-
private Singleton(Object ... params) {
-
// do somthing
-
}
-
}
一个类只会被同一个ClassLoader加载一次,且只会加载一次,这样在类被加载的时候就创建好了单例对象,以后直接取用即可。
阅读(477) | 评论(0) | 转发(0) |