Я использовал абстрактный шаблон фабрики, чтобы помочь с Dependency Injection и сделать мой проект более дружественным к юнит-тестам. Хорошую пару раз я сталкивался с тем, что мы должны возвращать объекты в состоянии готовности к использованию. Выполнение дополнительной работы, такой как получение состояния объекта из базы данных, усложняет тестирование, если только мы не смоделируем слой базы данных. Поэтому я перенес это на завод. Хотя на данный момент я думаю, что это должно быть изменено для строителя, потому что я не возвращаю семейство продуктов, есть только 1 продукт.
В любом случае, мне нужно убедиться, что в моем приложении есть только 1 экземпляр из 2 или 3 классов. Я сделал это на заводе. Я избегаю использования шаблона Singleton, потому что он мне не нравится. Я думаю, что это слишком сильно нарушает ОО, и есть лучшие способы сделать это. Это также делает модульное тестирование сложным. Так что моя фабрика содержит единственный экземпляр класса. Если кто-то запрашивает объект, я проверяю, создал ли я его, и возвращаю его.
Теперь мне нужно добавить еще несколько функций. Мне нужно иметь возможность сбросить состояние объекта. Например, мы можем изменить его конфигурацию в базе данных. Теперь мне нужно заполучить этот экземпляр и изменить его внутреннее состояние, чтобы отразить новую конфигурацию. Я не уверен, должен ли я придерживаться этого на фабрике, но это, кажется, нарушает Принцип Единой Ответственности. Другой альтернативой является создание объекта, который знает, как сбросить состояние этого объекта. Например:
class MyObjectResetter
{
private MyObject myObject;
private MyDao myDao;
public MyObjectResetter(MyObject myObject, MyDao myDao)
{
this.myObject = myObject;
this.myDao = myDao;
}
public void Reset()
{
myObject.Details = myDao.GetDetails();
myObject.MoreDetails = myDao.GetMoreDetails();
}
}
Есть идеи получше? Есть ли лучшие образцы?