工厂模式可以是通用的Singleton吗?

时间:2012-02-17 07:31:29

标签: php singleton overloading 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(),工厂类将返回类DoNot()的“singleton”对象,因为我们的工厂类My是静态的,具有静态范围,可以,然后,无处不在。

这不是Singleton的另一个例子吗?这是否与单身模式一样避免?

1 个答案:

答案 0 :(得分:4)

不,不是。您所描述的将是工厂模式的特殊用例,或者根本不是工厂。一个简单的工厂不进行'实例管理',它只返回所需的具体子类的新实例。

工厂方法本身是静态的这一事实并不意味着返回的子类的方法是。顾名思义,工厂生产具有非静态功能的具体对象。

http://sourcemaking.com/design_patterns/factory_method