我有一个班级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();
答案 0 :(得分:0)
您要做的是让Foo
成为单身人士,并通过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已经对它自己的实例化进行了监视。
答案 1 :(得分:0)
这里真的没有必要使用单例模式。单身是一种糟糕的模式,应该避免。
最佳解决方案是:在Bar
中创建一个静态工厂方法,以确保只创建一个Foo
。你已经做到了。
对于Foo
:只是不要在生产代码中实例化它。但是你真的想在你的测试中实例化Foo
的几个副本!因此,您无法使Foo
的构造函数成为非公开的。
通常只创建一次的对象应该在您的应用程序中发挥重要作用。它们最有可能在开始时创建一次,然后用于几个方面。为此创建一个专用的工厂类(或者每个主题可以创建一个:用于模型,用于数据库和模板)。养成只使用这些工厂创建物品的习惯。
或者甚至更好,将其作为配置添加到您的依赖注入框架中。获取对象时的用法基本相同。