你可以引入这样的抽象:
public abstract class Singleton<T> {
private T object;
public synchronized T get() {
if (object == null) {
object = create();
}
return object;
}
protected abstract T create();
}
Run Code Online (Sandbox Code Playgroud)
然后对于每个单例,你只需要这样写:
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>() {
...
Run Code Online (Sandbox Code Playgroud)
然后你可以通过编写来使用单例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() {
...
Run Code Online (Sandbox Code Playgroud)
是因为最终每个单例只需要多一行代码,并且初始化单例模式出错的可能性非常低。
| 归档时间: |
|
| 查看次数: |
252 次 |
| 最近记录: |