GenericFactory как синглтон - PullRequest
       8

GenericFactory как синглтон

8 голосов
/ 19 января 2011

Я прочитал статью Abstract Factory, Template Style Джима Хислопа и Херба Саттера. Эта фабрика реализована как синглтон. Они предоставили простой способ автоматической регистрации классов с помощью вспомогательного класса RegisterInFactory.

Теперь я несколько раз читал, что синглетонов следует избегать, некоторые даже считают их анти-паттернами, и есть лишь несколько случаев, когда они полезны. Это один из них? Или есть альтернативный подход, который обеспечивает такой простой способ автоматической регистрации классов?

1 Ответ

2 голосов
/ 19 января 2011

Как всегда для такого рода предмета, нет ответа, который бы относился ко всем проблемам.Некоторые говорили, что следует избегать синглтонов, когда они используются в качестве доступа к услуге.Это использование сродни использованию глобальных переменных.Таким образом вы маскируете тот факт, что вы используете службу X в своей реализации:

// in header
class MyUsefulClass
{
    public:
    void doSomethingUseful();
};

// in .cpp
MyUsefulClass::doSomethingUseful()
{
    // ...
    MyWonderfulService::instance().doService1();
    // ...
    MyWonderfulService::instance().doService2();
}

Вы создаете связь с MyWonderfulService, которую пользователи вашего класса не могут угадать.Более того, Вы не можете легко протестировать свой полезный класс с помощью фиктивного сервиса ...

Вот почему я обычно предпочитаю инверсию зависимости :

// in header
class MyUsefulClass
{
    public:
    void setServiceToUse(MyService&);
    void doSomethingUseful();

    // [...]
};

// in .cpp
MyUsefulClass::doSomethingUseful()
{
    // ...
    _myService->doService1();
    // ...
    _myService->doService2();
}

Этот способ обычносчитается лучше, так как связь между классами легче.Тем не менее, для некоторых служб, которые, как известно, широко используются в рамках, проще использовать синглтон.Это имеет смысл для отдельной службы, которая представляет собой службу, которая предоставляет вам доступ ко всем другим службам в рамках, например, ^^ Она часто используется для технических служб, таких как, например, ведение журнала.

my2c

Edit: я прочитал статью, так как основное внимание уделяется AbstractFactories, использование синглтона является случайным, а не дизайнерским решением.Это понятно из статьи, в которой вы не хотите писать вещи, которые не приведут вас к вашей мысли.

...