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服务定位器?我不知道,这取决于。。。如果你能避免的话,我认为你不应该这样做。这会使单元测试变得更加困难吗?是的。好的,这应该避免还是我可以使用它?你的静态单例注册工厂服务定位器?我不知道,这取决于。。。如果你能避免的话,我认为你不应该这样做。这会使单元测试变得更加困难吗?对