Используйте фабрику, чтобы обеспечить поведение одного экземпляра - PullRequest
0 голосов
/ 11 февраля 2019

В PHP я использую клиент, который подключается к порту и слушает его все время (используя цикл while).Если приходит сообщение, вызывается функция обратного вызова.Проблема в том, что вы можете установить только одну функцию обратного вызова для каждого клиента.Чтобы не иметь десятков клиентов, каждый из которых слушает только одного подписчика, я хочу поместить клиента в другой класс, который содержит одну общую функцию обратного вызова.Эта функция будет отправлять входящие сообщения соответствующим подписчикам.

В моем используемом фреймворке также используется шаблон фабрики.

Мне интересно, нормально ли это / чисто использовать фабрику, чтобы гарантироватьчто только один экземпляр клиента создан.И когда да, как это сделать?

В текущей реализации есть что-то вроде

private function getClient() {
    if(static::$client == null) 
    {
        static::$client = new Client();
    }
    return static::$client
}

, но я думаю, что это плохой дизайн из-за высокой зависимости в getClient () (это больше не взаимозаменяемо).

Вторая проблема заключается в том, что если я создам другой инкапсулирующий класс (в котором определен клиент), я всегда перезаписываю функцию обратного вызова.

Как можно гарантировать, что только один экземпляр инкапсулирующего класса с одним клиентом работает для правильной отправки всех зарегистрированных подписчиков?Это задача для завода?Любые другие подходы?

Спасибо

...