Php 工厂静态方法和私有构造函数
我有一个类Foo和一个类Bar,我想利用Bar的静态方法来获取Foo的单例实例,类似于BitmapFactory.create返回位图实例的方式,但是不应该使用新的Foo来实例化Foo,我如何获得它Php 工厂静态方法和私有构造函数,php,singleton,static-methods,Php,Singleton,Static Methods,我有一个类Foo和一个类Bar,我想利用Bar的静态方法来获取Foo的单例实例,类似于BitmapFactory.create返回位图实例的方式,但是不应该使用新的Foo来实例化Foo,我如何获得它 class Foo { $private Foo() {} // ?? } class Bar { private static $foo = null; static function getFooInstance() { if(Bar::$foo ==
class Foo {
$private Foo() {} // ??
}
class Bar {
private static $foo = null;
static function getFooInstance() {
if(Bar::$foo == null) $foo = new Foo();
return Bar::$foo;
}
}
$foo = Bar::getFooInstance();
您要做的是使Foo成为一个单例,并通过Foo::getInstance将Bar分配给Bar;例如:
class Foo {
private static $instance;
private function __construct(){}
public static function getInstance(){
if (!isset(self::$instance)){
self::$instance = new Foo();
}
return self::$instance;
}
public function __clone(){
throw new Exception("Cannot Clone Singletons... bad programmer");
}
}
class Bar {
static function getFooInstance() {
return Foo::getInstance();
}
}
没有必要在Bar中重播单例模式,因为Foo已经对它自己的实例化进行了策略。这里确实没有必要使用单例模式。单身是一种糟糕的模式,应该避免 最好的解决方案是:在Bar中创建一个静态工厂方法,确保只创建一个Foo。你已经这么做了 对于Foo:不要在您的生产代码中单独实例化它。但是您确实希望在测试中实例化几个Foo副本!因此,不能使Foo的构造函数非公共 通常只创建一次的对象应该在应用程序中发挥重要作用。它们最有可能在开始时创建一次,然后用于多种用途。为此创建一个专用的factory类,或者每个主题创建一个:用于模型、数据库和模板。养成只使用这些工厂创建对象的习惯
或者更好,将其作为配置添加到依赖项注入框架中。获取对象时的用法基本相同。1而不是self::$instace=new Foo您可以将其定义为self:$instance=new self 2您可以在这里遵循干式原则,就像:$i=&self:$instance;如果为空$i{$i=new self;}返回$i@DaveJust你这样做不会有任何收获…它总是会返回一个Foo。。。您必须使用static而不是self,因为它意味着任何不同的东西,比如foo的子类。