使用构建器功能创建Singleton类

时间:2015-02-25 10:29:36

标签: design-patterns singleton builder

考虑以下假设的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中可能有很多属性,而构建器模式使代码更容易使用和阅读。

1 个答案:

答案 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的任何内容都会在适当的时间显示出来。

我的经验是,这会带来更清晰,更可测试的代码。