工厂不是一般的单身人士吗?或者工厂模式有时可能是单身人士吗? 假设我们有以下工厂模式类:
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的另一个例子吗?这是否与单身模式一样避免?
答案 0 :(得分:4)
不,不是。您所描述的将是工厂模式的特殊用例,或者根本不是工厂。一个简单的工厂不进行'实例管理',它只返回所需的具体子类的新实例。
工厂方法本身是静态的这一事实并不意味着返回的子类的方法是。顾名思义,工厂生产具有非静态功能的具体对象。