繁体   English   中英

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

[英]Suggestions for implementing a solution using Singleton design pattern

我需要实施一个解决方案作为测试框架的一部分,出于以下原因,我正在考虑使用单例模式。 但是,我无法实现预期的解决方案,因此需要有关可能实现的一些建议/意见。

问题陈述:我有一个环境(我正在测试的产品的环境)配置属性文件,该文件要加载并使测试框架可以全局访问的参数值。 我想使用单例模式,因为这些属性是一次性值(如果尝试多次初始化,则应报告异常),应该是全局可用的,并且可以单点访问方法。

但是,属性/参数的列表确实很长,因此将其分为模块(类)是明智的。 对于下面的解释,我尝试使用合成。

例如

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:只是示例输入代码,用于理解我的问题陈述。

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

字符串主机名= Configuration.getHostname();

要么

字符串主机名= Configuration.getConfigObject()。getHostname();

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

多重继承可以解决该问题,但Java不支持,因此排除了这种情况。 也不能考虑接口,因为覆盖所有方法既繁琐又冗长,并且参数/方法将随着时间不断变化。

欢迎所有建议,即使它需要取消此设计模式并尝试其他操作。

您将无法“自动”将静态调用委派给模块。 而且,即使您所说的调用不是静态的,Java也不支持多重继承。

选项1:

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

Configuration.getDatabaseConfiguration().getServerName();

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

选项2:

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

然后,您将为每个模块创建一个接口,其中所有的getter都具有默认实现。 您的主要配置类将实现所有模块接口,而不覆盖任何方法。 这样,可以从一个对象中查询所有配置条目,但是您仍然必须通过静态方法来获取此对象。 您将获得尽可能接近的多重继承。 我当然会推荐选项1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM