Мне нужно реализовать решение как часть тестовой среды, и я рассматриваю одноэлементный шаблон по причинам, описанным ниже. Однако я не могу достичь намеченного решения, поэтому мне понадобятся некоторые предложения/входы по возможным реализациям.
Постановка проблемы: у меня есть файл свойств конфигурации среды (env продукта, который я тестирую), который я хочу загрузить и сделать значения параметров доступными глобально для тестовой среды. Я решил использовать шаблон 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: Просто пример набранного кода для понимания моей постановки задачи.
Ожидание: Ожидается, что при попытке получить имя хоста у меня должна быть единая точка доступа через статический объект конфигурации (при условии, что я успешно инициализировал все переменные-члены), т.е.
Строковое имя хоста = Configuration.getHostname();
OR
Строковое имя хоста = Configuration.getConfigObject().getHostname();
Текущая проблема: как создать один статический объект, который будет ссылаться на все методы, используя либо композицию, либо наследование (Концептуально, композиция была бы правильным подходом).
Множественное наследование решило бы проблему, но Java не поддерживает, что исключено. Также нельзя рассматривать интерфейсы, потому что переопределение всех методов утомительно и долго, а параметры/методы будут меняться с течением времени.
Приветствуются все предложения, даже если для этого требуется отказаться от этого шаблона проектирования и попробовать что-то другое.
Configuration
, который переводит статические вызовы самого себя в статические вызовы своих статических членов (модулей)? И что вы подразумеваете под параметрами/методами, которые будут меняться со временем? - person Cybran   schedule 19.11.2015