Нужен единственный экземпляр объекта с использованием фабрики с возможностью сброса состояния объекта - PullRequest
1 голос
/ 09 марта 2010

Я использовал абстрактный шаблон фабрики, чтобы помочь с 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();
    }
}

Есть идеи получше? Есть ли лучшие образцы?

Ответы [ 2 ]

1 голос
/ 09 марта 2010

Так что моя фабрика содержит один экземпляр класса. Если кто-то спросит для объекта я проверяю, есть ли у меня уже создал его и вернул.

Но это паттерн Синглтон! Я не понимаю, как ты этого избежал.

Я не уверен, стоит ли мне воткнуть это на завод, но это, кажется, нарушать единую ответственность Принцип.

Ваш объект отвечает за хранение конфигурации. Согласно SRP, он также должен предоставлять метод refresh() для обновления конфигурации, что все еще является частью его ответственности. Но вы, вероятно, не хотите, чтобы он обращался к базе данных. Ват, что вы могли бы сделать, то что-то вроде

class Configuration
{
   static Configuration getConfiguration()
   {
       // factory method to get the config -- kind of singleton
       // calls the DAO somewhere, e.g. configDao.getConfig();
   }

   void refresh()
   {
       // calls the DAO and refresh itself
       // configDao.refresh( this );
   }
}

class PeriodicThread
{
    Configuration.getConfiguration().refresh();
}

Существует одна и только одна конфигурация, которая периодически обновляется. Я не возражаю против такого дизайна.

Если вы используете DI-фреймворк, который управляет «синглтоничностью» (уникальность - лучшее слово) конфигурации, метод getConfiguration не нужен и уходит. Конфигурация вводится всякий раз, когда это необходимо.

0 голосов
/ 09 марта 2010

Я бы также применил функцию сброса к фабрике, так как, на мой взгляд, фабрика несет ответственность за предоставление необходимых объектов своим клиентам в целом. Перезагрузка состояния объекта из БД (таким образом, эффективно воссоздав объект с другим состоянием) ИМХО вписывается в эту общую ответственность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...