单例模式与公共构造函数

时间:2015-05-13 06:47:12

标签: php oop design-patterns singleton

我想将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实例。

感谢。

4 个答案:

答案 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()
    {
    }    
}