【抄书】设计模式||单例模式

2022-01-07  本文已影响0人  hdormy

【例子均采用php】

单例,顾名思义,只能实例化一次。

那怎样才能保证类只被实例化一次呢?那就要看影响类实例化的因素了。

首先,你不想你的类被别人随意实例化,你就得用构造函数来管控,用构造函数,把你的类藏起来,不让别人看到,他还能new?


class Single

{

    private function __construct(){

        echo "我是单例";

}

}


new它!是不是得到这个错误啦?

Fatal error: Uncaught Error: Call to private Single::__construct() from invalid context in D:\www\single.php:18 Stack trace

完了!不能被new的类,你拿着有什么用?

嘿嘿,自己的东西,就自己想用呗,咱关起门来自己new:


class Single

{

    private function __construct(){

echo "我是单例";

}

    public static function instance ()

{

        return new self();

}

}


现在Single::instance (); 浏览器输出:我是单例

可是,有没有发现一个问题,此时,我每调用一次instance 方法,它还是会去实例化一次,那这个单例就没起作用呀!怎么办呢?别着急,且看我把它实例化次数给限制咯:


class Single

{

    private static $instance;

    private function __construct(){

echo "我是单例";

}

    public static function instance ()

{

          //此处加判断

          if(!self::$instance instanceof self) {

              self::$instance = new self;

          }

return self::$instance;

}

}


现在,无论你调用多少次Single::instance (); 是不是只会输出一个“我是单例”?

你以为这样就可以睡大觉了?克隆羊多利死了,还有无数个克隆类!为了防止我们实例化的对象被克隆,我们还要把克隆通道给它关咯!


class Single

{

    private static $instance;

    private function __construct(){

echo "我是单例";

}

    public static function instance ()

{

//此处加判断

          if(!self::$instance instanceof self) {

self::$instance = new self;

}

return self::$instance;

}

    private function __clone(){}

}


现在,单例才真的完成!

口口相传的“三私一公”:私有化构造函数,防止任意实例化类;私有化属性,存放实例化的对象,控制实例化次数;私有化克隆方法,防止对象被任意复制;公开的静态方法,供外部调用。

上一篇 下一篇

猜你喜欢

热点阅读