【例子均采用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(){}
}
现在,单例才真的完成!
口口相传的“三私一公”:私有化构造函数,防止任意实例化类;私有化属性,存放实例化的对象,控制实例化次数;私有化克隆方法,防止对象被任意复制;公开的静态方法,供外部调用。
网友评论