[英]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也不支持多重继承。
让您的主要Configuration
类提供将实例返回到模块的静态方法。 每当您想读取配置条目时,首先获取模块实例,然后查询条目本身:
Configuration.getDatabaseConfiguration().getServerName();
此方法的优点是非常清楚您要指的是配置的哪一部分。 如果仅使用Configuration.getServerName()
,则无法区分是要检索数据库的服务器名称还是要检索Web服务器的名称。
如果您能够使用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.