1

我有一个类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();
4

2 回答 2

0

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

最好的解决方案是:制作一个静态工厂方法Bar,保证只会Foo创建一个。你已经这样做了。

并且Foo:不要在您的生产代码中自行实例化它。但是你真的想Foo在你的测试中实例化几个副本!因此,您不能将构造函数设为Foo非公开。

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

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

于 2013-07-25T08:09:31.827 回答
0

您要做的是创建Foo一个单例并通过例如Bar分配给 bar :Foo::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 已经控制了它自己的实例化。

于 2013-07-25T04:49:04.020 回答