Может ли фабричный шаблон быть универсальным синглетом?


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

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(), фабричный класс вернет "одноэлементный" объект класса DoNot(), который, поскольку наш фабричный класс My статичен, имеет статическую область действия и может быть вызван везде.

Разве это не еще один пример Синглтона? Следует ли этого избегать так же, как и одноэлементного шаблона?

Author: Shoe, 2012-02-17

1 answers

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

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

Http://sourcemaking.com/design_patterns/factory_method

 4
Author: markus, 2012-02-17 07:58:10