Php 工厂静态方法和私有构造函数

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 ==

我有一个类Foo和一个类Bar,我想利用Bar的静态方法来获取Foo的单例实例,类似于BitmapFactory.create返回位图实例的方式,但是不应该使用新的Foo来实例化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的子类。