Что касается проблемы с надутым вызовом конструктора, вы можете ввести классы параметров или фабричные методы, чтобы использовать эту проблему для себя.
A класс параметров перемещает некоторые данные параметров в свой собственный класс, например, как это:
var parameterClass1 = new MenuParameter(menuBar, editor);
var parameterClass2 = new StuffParameters(sasquatch, ...);
var ctrl = new MyControllerClass(managedStore, parameterClass1, parameterClass2);
Это как бы просто перемещает проблему в другое место. Вы могли бы хотеть содержать своего конструктора вместо этого. Сохраняйте только те параметры, которые важны при создании / инициализации рассматриваемого класса, и делайте все остальное с помощью методов получения / установки (или свойств, если вы используете .NET).
A фабричный метод - это метод, который создает все необходимые вам экземпляры класса и имеет преимущество инкапсуляции создания указанных объектов. Их также довольно легко реорганизовать в сторону от Singleton, потому что они похожи на методы getInstance, которые вы видите в шаблонах Singleton. Допустим, у нас есть следующий простой, не поточечный, простой пример:
// The Rather Unfortunate Singleton Class
public class SingletonStore {
private static SingletonStore _singleton
= new MyUnfortunateSingleton();
private SingletonStore() {
// Do some privatised constructing in here...
}
public static SingletonStore getInstance() {
return _singleton;
}
// Some methods and stuff to be down here
}
// Usage:
// var singleInstanceOfStore = SingletonStore.getInstance();
Это легко изменить на заводской метод. Решение состоит в том, чтобы удалить статическую ссылку:
public class StoreWithFactory {
public StoreWithFactory() {
// If the constructor is private or public doesn't matter
// unless you do TDD, in which you need to have a public
// constructor to create the object so you can test it.
}
// The method returning an instance of Singleton is now a
// factory method.
public static StoreWithFactory getInstance() {
return new StoreWithFactory();
}
}
// Usage:
// var myStore = StoreWithFactory.getInstance();
Использование по-прежнему такое же, но вы не увязли в наличии единственного экземпляра. Естественно, вы бы переместили этот метод фабрики в его собственный класс, так как класс Store
не должен заниматься самим созданием себя (и по совпадению следует принципу единственной ответственности как эффект перемещения метода фабрики).
Отсюда у вас есть много вариантов, но я оставлю это как упражнение для себя. Здесь легко перегружать (или перегревать) шаблоны. Мой совет - применять шаблон только тогда, когда в нем потребность .