【发布时间】:2014-03-26 23:49:19
【问题描述】:
假设我们有基类:
public class Base {
public Base(int i) {
/* ... */
}
/* ... */
}
我们想基于这个类创建单例。问题是类有公共构造函数,所以扩展它会导致单例也有公共构造函数:
public class SingletonBase extends Base {
private static final SingletonBase _instance = new SingletonBase();
private SingletonBase() {
super(0);
}
public SingletonBase(int i) { // Want to avoid this!
super(i)
}
public static void getInstance() {
return _instance;
}
/* ... */
}
当然,单例不能有公共构造函数,所以我们要避免这种情况。 那么,让适当的 Singleton 具有类 Base 的功能的最优雅的方式/模式是什么?
编辑:禁止修改基类,因为它来自外部库。
【问题讨论】:
-
只需将
SingletonBase的所有构造函数声明为私有 -
忘了说,我不能修改基类——它来自外部库。
-
但是 SingletonBase 只能有一个构造函数...只需删除公共的构造函数即可。为什么在地球上你对 Singleton 使用抽象?如果您想重用框架代码,只需使用单例中的 Base 对象即可。
-
如果你不能直接访问base的源,你可以诉诸反射。
-
也许你可以“更喜欢组合而不是继承”,我的意思是在你的 Singleton 类中保留一个
Base的实例。您应该记住,通过继承,应该能够使用每个子类而不是超类,并且制作单例子类并不完全适合。也许想想你是否真的需要一个单身人士。
标签: java design-patterns singleton