java - 如何使用工厂模式来获取数据库客户端的实例?

标签 java thread-safety singleton factory-pattern

下面是我的界面 -

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/

相关文章:

java - 是否可以在 Spring MVC(或 Boot)的外部目录中使用 .jsp 文件?

java - 尽管添加了 android :usesCleartextTraffic and android:networkSecurityConfig,但仍不允许明文 HTTP 流量

java - 将类对象作为同步变量

java - 如何使用 Mockito/Powermock 模拟枚举单例类?

c++ - 在 C++ 类中初始化单例

java - 在 Eclipse 中同时运行多个类时共享资源

java - 每当实例化(空)构造函数时应用程序就会崩溃

java - java中读/写变量的原子操作

c++ - 等待函数和 CloseHandle 依赖

c# - 如何实现 Singleton,它在 C# 中从 db 填充其值?