使用Singleton设计模式实现解决方案的建议



我需要实现一个作为测试框架&我正在考虑单身模式,原因如下。然而,我无法实现我想要的解决方案&因此需要对可能的实现提出一些建议/投入。

问题说明:我有一个环境(我正在测试的产品的环境)配置属性文件,我想加载它&使测试框架能够全局访问参数的值。我认为使用singleton模式是因为这些属性是一次性的值(如果尝试多次初始化,则应报告异常),应该是全局可用的&拥有对方法的单点访问权限。

然而,属性/参数的列表确实很长&因此,明智的做法是将其分解为模块(类)。对于下面的解释,我尝试了构图。

例如

public class Configuration {
    private static Configuration configObj;
    private static Database dbDetails;
    private static Machine macDetails;
    //...
    //... many more modules
    public static synchronized void createInstance(Properities envProps){
          //Should create only one instance of Configuration 
          // and should also initialize Database & Machine objects.
    }
    public static Configuration getConfigObject(){
         return configObj;
    }
}

public class Database {
    private static String dbConnectString;
    public Database(String dbcs){
         dbConnectString = dbcs;
    }
    public static String getDbConnectString(){
         return dbConnectString;
    }
}

public class Machine {
    private static String hostname;
    private static String loginUsername;
    public Machine(String hostname,String loginUsername){
        this.hostname = hostname; //It may include some trimming/cleaning
        this.loginUsername = loginUsername;
    }
    public static String getHostName(){
        return hostname;
    }
}

PS:只是一个键入代码的示例,用于理解我的问题陈述。

期望值:现在的期望值是,当尝试获取主机名时,我应该通过配置静态对象(假设我已经成功初始化了所有成员变量)拥有一个单一的访问点,即

字符串hostname=Configuration.getHostname();

字符串hostname=Configuration.getConfigObject().getHostname();

当前问题:如何创建一个静态对象,该对象将使用组合或继承引用所有方法(从概念上讲,组合将是正确的方法)。

多重继承本来可以解决这个问题,但Java不支持,所以排除了这个可能性。也不能考虑接口,因为覆盖所有方法都是乏味的&冗长的&参数/方法将随着时间不断变化。

所有的建议都是受欢迎的,即使它需要废除这种设计模式&尝试一些不同的东西。

您将无法"自动"将静态调用委托给模块。即使调用不是静态的,正如您所说,Java也不支持多重继承。

选项1:

让您的主Configuration类提供将实例返回到模块的静态方法。每当您想读取配置条目时,首先获取模块实例,然后查询条目本身:

Configuration.getDatabaseConfiguration().getServerName();

这种方法的优点是,它非常清楚你指的是配置的哪一部分。如果你只使用Configuration.getServerName(),你就无法区分是要检索数据库的服务器名称,还是要检索Web服务器的名称。

选项2:

如果您能够使用Java8,并且您的配置很大,但非常简单(在编译时静态已知或可从极少数实例中提取),则可以考虑使用新的默认接口方法(https://blog.idrsolutions.com/2015/01/java-8-default-methods-explained-5-minutes/)。

然后,您将为每个模块创建一个接口,其中所有getter都有默认实现。您的主配置类将在不重写任何方法的情况下实现所有模块接口。通过这种方式,可以从一个对象查询所有配置条目,但您仍然必须通过静态方法获取该对象。这是尽可能接近多重继承的。不过,我肯定会推荐选项1。

相关内容

  • 没有找到相关文章

最新更新