考虑以下假设的Singleton类DateSingleton
,其目前如下所示:
public class DateSingleton {
private static DateSingleton instance = new DateSingleton();
private String year;
private String month;
private String day;
private DateSingleton() {
}
public static DateSingleton getInstance(){
return instance;
}
}
这个Singleton可以被认为是一个日期管理员,我的整个Web应用程序中只存在其中一个。我希望能够进行以下类型的构建器样式调用来分配我的状态:
DateSingleton.getInstance().year("2015").month("February").day("25");
有人可以建议我需要将哪些代码添加到DateSingleton
类以使其成为可能吗?将Singleton作为构建器是否被认为是不好的做法?
我意识到我可以添加getter和setter来实现相同的功能。但是我想摆脱这种情况,因为这个Singleton中可能有很多属性,而构建器模式使代码更容易使用和阅读。
答案 0 :(得分:1)
我会分开"我的整个网络服务只需要一个值"从"这个班级应该是单身"。后者是一个可能的实现,但它肯定不是唯一的。
我认为这是某些配置数据的一部分。您可以分离"获取配置"从配置类开始。例如,您可以:
// TODO: Validation and thread-safety; see below
public final class ConfigurationHolder {
private static Configuration configuration;
public static void setConfiguration(Configuration configuration) {
ConfigurationHolder.configuration = configuration;
}
public static ConfigurationHolder getConfiguration() {
return configuration;
}
}
然后,您需要进行适当的同步,验证在调用getConfiguration
时,已设置配置,并且可能验证其仅设置曾经,可能采用resetForTest
方法来实现它在锡上所说的内容。
此时,Configuration
可以是具有适当构建器的不可变类型 - 在您的Web应用程序启动代码中,您可以使用构建器构建它,然后设置它,然后在其他地方访问它。
更好将使用依赖注入来避免拥有这个全局"持有者"首先是国家。通过依赖注入,您的启动代码仍然可以使用构建器创建适当的配置,然后告诉DI框架该配置在任何地方都可以使用。 需要 Configuration
的任何内容都会在适当的时间显示出来。
我的经验是,这会带来更清晰,更可测试的代码。