这可能听起来像一个奇怪的想法,但我还没有想到它。
假设您的应用程序最终需要一定数量的单例来执行某些I / O.您可以编写一个单例并基本上根据需要多次重现代码。
然而,作为程序员,我们应该提出创造性的解决方案,避免任何形式的冗余或重复。什么是解决方案,使多个人可以作为一个单身人士。
P.S:这是一个不能使用Spring等框架的项目。
答案 0 :(得分:3)
你可以引入这样的抽象:
public abstract class Singleton<T> {
private T object;
public synchronized T get() {
if (object == null) {
object = create();
}
return object;
}
protected abstract T create();
}
然后对于每个单身人士,你只需要写下这个:
public final Singleton<Database> database = new Singleton<Database>() {
@Override
protected Database create() {
// connect to the database, return the Database instance
}
};
public final Singleton<LogCluster> logs = new Singleton<LogCluster>() {
...
然后你可以通过写database.get()
来使用单身人士。如果尚未创建单例,则会创建并初始化它。
人们可能不这样做的原因,并且喜欢反复写这样的东西:
private Database database;
public synchronized Database getDatabase() {
if (database == null) {
// connect to the database, assign the database field
}
return database;
}
private LogCluster logs;
public synchronized LogCluster getLogs() {
...
因为最终每个单例只有一行代码,并且初始化单例模式错误的可能性非常低。
答案 1 :(得分:3)
然而,作为程序员,我们应该提出创造性的解决方案,以避免任何形式的冗余或重复。
这是不正确的。作为程序员,我们应该提出符合以下标准的解决方案:
(这些标准通过降低优先级来粗略排序,但不同的上下文可能会指示不同的顺序。)
创造性不是必需的,“避免冗余或任何类型的重复”也不是。事实上,如果程序员忽略了真正的标准,这两者都会有明显的危害。
回到你的问题。你应该只是寻找替代方法来做单例,如果它真的会使代码更易于维护。复杂的“创造性”解决方案很可能会回归咬您(或将来必须维护您的代码的人),即使他们成功减少了重复代码的行数。
正如其他人所指出的那样(例如@BalusC),目前的想法是在很多应用类别中应该避免 。
答案 2 :(得分:2)
确实存在multiton模式。无论如何,我60%肯定原始问题的真正解决方案是RDBMS。
答案 3 :(得分:2)
所有单身实际上都是全球数据。全球数据不好。它使单元测试不可能。它使追踪奇怪的错误变得更加困难。
“四人帮”这本书在这里是错误的。或至少在十五年后过时。
如果您只想要一个实例,请让工厂只生一个。很容易。
答案 4 :(得分:1)
如何将参数传递给创建单例的函数(例如,它的名称或特化),知道为每个唯一参数创建单例?
答案 5 :(得分:-1)
我知道你问过Java,但这里有PHP的解决方案作为例子:
abstract class Singleton
{
protected function __construct()
{
}
final public static function getInstance()
{
static $instances = array();
$calledClass = get_called_class();
if (!isset($instances[$calledClass]))
{
$instances[$calledClass] = new $calledClass();
}
return $instances[$calledClass];
}
final private function __clone()
{
}
}
然后你写下:
class Database extends Singleton {}