首页 » PHP教程 » php自学抄书代码技巧_抄书设计模式 单例模式

php自学抄书代码技巧_抄书设计模式 单例模式

访客 2024-12-07 0

扫一扫用手机浏览

文章目录 [+]

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

那若何才能担保类只被实例化一次呢?那就要看影响类实例化的成分了。

php自学抄书代码技巧_抄书设计模式  单例模式

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

php自学抄书代码技巧_抄书设计模式  单例模式
(图片来自网络侵删)

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

}

现在,单例才真的完成!

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

相关文章