我想将Singleton Design Pattern实现为一个类,该类使用PHP中的公共构造函数扩展另一个类。例如,考虑一个类,比如Animal:
class Animal
{
public function __construct()
{
}
}
我想将Singleton Design Pattern实现为扩展Animal的类,例如:
class Dog extends Animal
{
protected function __construct()
{
}
public static function getInstance()
{
static $instance = null;
if (null === $instance) {
$instance = new static();
}
return $instance;
}
}
如果我尝试Dog::getInstance()
,则会出错
致命错误:Dog :: __ construct()的访问级别必须是公共的(如 类动物)
但是如果我将类Dog的构造函数设为public,那么实现Singleton模式就没有意义了。
是否有解决方法以便我可以在扩展类Animal时将Singleton模式实现到类Dog?或者是否有更好的设计模式来实现我的目标?
我无法修改Animal
,因为它属于某个库。我完全控制Dog
。我真正希望实现的是Dog
能够扩展Animal
,但我不想创建多个Dog
实例。
感谢。
答案 0 :(得分:1)
首先,单例模式不是反模式。它是为了一个目的而制定的。如果你错过了目的那么你就会误用它。
问题: 扩展一个类使它成为一个单例没有任何意义。特别是如果API在您遇到的情况下拒绝访问构造。
我的建议: 赞成合成而不是继承。因此,创建一个没有继承的自己的类并应用单一模式。关联Animal-Object并将您想要的任何方法委托给Animal-Object。
答案 1 :(得分:0)
您可以将 public static Bitmap getScreenShot(View view) {
View screenView = view.getRootView();
screenView.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
screenView.setDrawingCacheEnabled(false);
return bitmap;
}
声明为Animal
,然后您可以将interface
保持为受保护状态。
OR是否有更好的设计模式来实现我的目标?
通过实施单身(anti-) pattern并不清楚你想要实现的目标,特别是在动物建模的背景下,所以很难回答这个问题。目前,我只能将数据库连接和注册表(会话)视为使用单例的可行用例(当然,在Web应用程序的上下文中)。
答案 2 :(得分:0)
@Havelock感谢您提及(反)模式。我很容易用Factory模式实现我想要的东西。这是我的完整代码:
class Animal
{
public function __construct()
{
}
}
class Dog extends Animal
{
public function __construct()
{
}
public function run()
{
echo 'The dog runs';
}
}
class DogFactory
{
public static function create()
{
static $instance = null;
if (null === $instance) {
$instance = new Dog();
}
return $instance;
}
}
$d = DogFactory::create();
$d->run();
答案 3 :(得分:-2)
请看是否是你的正确答案。
class Animal
{
protected function __construct()
{
}
public static function getInstance()
{
static $instance = null;
if (null === $instance) {
$instance = new static();
}
return $instance;
}
}
class Dog extends Animal
{
function __construct()
{
}
}