Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 工厂模式可以是通用的单例吗?_Php_Singleton_Overloading_Factory - Fatal编程技术网

Php 工厂模式可以是通用的单例吗?

Php 工厂模式可以是通用的单例吗?,php,singleton,overloading,factory,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

工厂不是一般的单身汉吗?或者工厂模式有时可能是单一模式? 假设我们有以下工厂模式类:

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);
我们返回一个对象,该对象现在存储在factory类的缓存中。 如果我们再次调用它,我们的工厂类将不会实例化新对象,而是再次使用相同的对象

例如,如果我们设置
My::DontKnow('sample',3)->setSomething('key','myvalue')My::DontKnow('sample',3)->getSomething('key')它将打印
myvalue

但是如果我们调用
My::DoNot()
工厂类将返回一个类DoNot()的“singleton”对象,因为我们的工厂类
My
是静态的,具有静态作用域,并且可以到处调用


这不是单身汉的另一个例子吗?这是为了避免单例模式吗?

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

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


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

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


工厂不一定,甚至通常不缓存它所创建的对象,工厂通常也不是静态调用的。您描述的是注册表或单例,而不是工厂。@deceze,但这是一个工厂类。它只是静态地生成对象。这是真的,没有必要这么做。但这是可能发生的。这不是单身汉。它与单例无关,只是因为它是静态的。仅仅因为你称它为工厂并不意味着它是一个工厂。:)您拥有的是一个静态的Singleton Registry Factory服务定位器,而不仅仅是一个简单的工厂。但更重要的是,你想要实现什么。它做了它应该做的吗?它是封装的吗?是松耦合等吗@deceze回答得很好+工厂不一定,甚至通常不缓存它所创建的对象,工厂通常也不是静态调用的。您描述的是注册表或单例,而不是工厂。@deceze,但这是一个工厂类。它只是静态地生成对象。这是真的,没有必要这么做。但这是可能发生的。这不是单身汉。它与单例无关,只是因为它是静态的。仅仅因为你称它为工厂并不意味着它是一个工厂。:)您拥有的是一个静态的Singleton Registry Factory服务定位器,而不仅仅是一个简单的工厂。但更重要的是,你想要实现什么。它做了它应该做的吗?它是封装的吗?是松耦合等吗@deceze回答得很好+1好的,这应该避免还是我可以使用它?您的静态Singleton Registry Factory服务定位器?我不知道,这取决于。。。如果你能避免的话,我认为你不应该这样做。这会使单元测试变得更加困难吗?是的。好的,这应该避免还是我可以使用它?你的静态单例注册工厂服务定位器?我不知道,这取决于。。。如果你能避免的话,我认为你不应该这样做。这会使单元测试变得更加困难吗?对