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

时间:2013-07-25 03:53:09

标签: php singleton static-methods

我有一个班级Foo和一个班级Bar,我希望利用Bar的静态方法来获取Foo的单例实例,(类似于方式BitmapFactory.create()会返回Bitmap个实例),但Foo不应该使用new 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();

2 个答案:

答案 0 :(得分:0)

您要做的是让Foo成为单身人士,并通过BarFoo::getInstance();分配到栏位。例如:

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已经对它自己的实例化进行了监视。

答案 1 :(得分:0)

这里真的没有必要使用单例模式。单身是一种糟糕的模式,应该避免。

最佳解决方案是:在Bar中创建一个静态工厂方法,以确保只创建一个Foo。你已经做到了。

对于Foo:只是不要在生产代码中实例化它。但是你真的想在你的测试中实例化Foo的几个副本!因此,您无法使Foo的构造函数成为非公开的。

通常只创建一次的对象应该在您的应用程序中发挥重要作用。它们最有可能在开始时创建一次,然后用于几个方面。为此创建一个专用的工厂类(或者每个主题可以创建一个:用于模型,用于数据库和模板)。养成只使用这些工厂创建物品的习惯。

或者甚至更好,将其作为配置添加到您的依赖注入框架中。获取对象时的用法基本相同。