Может ли шаблон фабрики быть универсальным синглтоном? - PullRequest
2 голосов
/ 17 февраля 2012

Разве фабрика не является общим синглтоном?Или иногда фабричный образец может быть синглтоном?Давайте предположим, что у нас есть следующий класс шаблонов Factory:

abstract class Factory {

    /* This cache contains objects that has already been called.
    ** It stores the class name, arguments and the object itself.
    ** If an another call for the same class with the same arguments 
    ** is made we return the object.
    */ 
    private static $cache;

    public static function __callStatic($class, $args) {
        // 1) we check if the class already exists in the cache

            // 2) if it does then we return the object in the cache

            // 3.1) otherwise we create a new object
            // 3.2) we pass to the constructor of that object the arguments with ReflectionClass
            // 3.3) we store the class name, arguments and object in the cache
    }

}

И конкретный класс

class My extends Factory {}

И давайте предположим, что у нас есть класс DontKnow($arg1, $arg2), который принимает аргументы $arg1 и $arg2 конструктору.И давайте предположим, что у нас есть другой класс DoNot(), который не принимает никаких параметров для конструктора.

Теперь, когда мы вызываем

My::DontKnow('sample', 3);

, мы возвращаем объект, который теперь хранится внутрикеш нашего заводского класса.Если мы вызовем его снова, наш фабричный класс не будет создавать экземпляр нового объекта, но будет использовать его снова.

Так, например, если мы установим My::DontKnow('sample', 3)->setSomething('key', 'myvalue'); и внутри другой области, которую мы называем My::DontKnow('sample', 3)->getSomething('key');, будет напечатано myvalue.

Но если мы вызовем My::DoNot(), класс фабрики вернет"singleton" объект класса DoNot (), который, поскольку наш фабричный класс My является статическим, имеет статическую область видимости и может затем вызываться везде.

Не является ли это еще одним примером Singleton?Это нужно избегать так же, как и паттерн Синглтон?

1 Ответ

4 голосов
/ 17 февраля 2012

Нет, это не так.То, что вы описываете, будет особым случаем использования фабричного шаблона или вообще не фабричным.Простая фабрика не выполняет «управление экземплярами», она просто возвращает новый экземпляр нужного конкретного подкласса.

Тот факт, что сам фабричный метод является статическим, не означает, что методы возвращаемогоПодкласс есть.Фабрика, как следует из названия, производит конкретные объекты с нестатической функциональностью.

http://sourcemaking.com/design_patterns/factory_method

...