下面是我的界面 -
public interface IDBClient {
public String read(String input);
public String write(String input);
}
这是我的界面实现 -
public class DatabaseClient implements IDBClient {
@Override
public String read(String input) {
}
@Override
public String write(String input) {
}
}
现在我正在考虑编写Thread Safe Singleton Factory
来获取DatabaseClient
的实例,以便我可以调用read
和因此我按照Initialization On Demand Holder这样写了
方法。成语,它还不完整 -
public class DatabaseClientFactory {
public static DatabaseClientFactory getInstance() {
return ClientHolder.s_instance;
}
private static class ClientHolder {
}
}
我不确定如何在上面的工厂中正确获取 DatabaseClient
的实例?我是否需要添加另一个方法 getClient()
来获取 DatabaseClient
的实例,然后像这样调用 -
IDBClient client = DatabaseClientFactory.getInstance().getClient();
client.read(input); // or client.write(input)
最佳答案
您应该使用Initialization-on-demand holder idiom ,实现你的工厂:
public class DatabaseClientFactory {
private DatabaseClientFactory() {}
private static class LazyHolder {
private static final DatabaseClient INSTANCE = new DatabaseClient();
}
public static DatabaseClient getInstance() {
return LazyHolder.INSTANCE;
}
}
由于类加载器的约定,此代码不需要同步:
- 类加载器在首次访问类时加载类
- 所有静态初始化都在任何人可以使用类之前执行
- 类加载器有自己的同步,可以保证前两点是线程安全的
关于java - 如何使用工厂模式来获取数据库客户端的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21034462/