单例模式,顾名思义:在执行过程中,只有一个实例,另外还需要提供一个可以随时可以访问它的全局。
他有几个典型的特征:
- 1.私有化静态属性,静态变量不会随着函数的调用、退出而存在和消失,我们可以利用这个特点来存储实例化的对象;
- 2.私有化构造函数,这个好理解,为的是把对象的实例化放在需要的地方;
- 3.公有化静态方法,这个公有化的静态方法就是2中所说的需要的地方;
针对php来说,我们还需要私有化克隆方法;
举例:
我是一个CD内容供应商,我现在想把我的CD卖出去,我就找了两个工厂来给我进行代工,我给两个工厂授权CD内容。只要CD内容的供应商没有倒闭,那代工厂只需要拿到授权就行,不需要针对每个代工厂建立一个CD内容的供应商。
闲言碎语不多讲,上代码:
通过上面的分析,我们可以看出CD内容供应商是一个单例,我们看看是怎么实现的
class CD
{
static private $_instance;//私有化静态属性
//防止使用new直接创建对象
private function __construct(){}
//私有克隆方法,防止克隆
private function __clone(){}
/**
* 实例化对象
*
* @return string
*/
static public function instance()
{
//判断$_instance是否是Singleton的对象,不是则创建
//将实例化的对象存到我们的静态私有成员变量中,
//这样的话,下次调用时候可以直接判断该变量是否存在
//因为php没有线程、异步概念,所以我们不用考虑线程安全
if (!self::$_instance instanceof self)
{
p('new intance:' . __CLASS__);
self::$_instance = new self();
}
return self::$_instance;
}
/**
* 授权CD内容
*/
public function content()
{
p('授权CD内容:');
}
}
这样我们就完成CD内容供应商的建设。
接下来我们来找代工厂
class CDFactory1
{
static public function produce()
{
p('Start:' . __CLASS__ . ' produce cd');
//装配内容
CD::instance()->content();
p('End:' . __CLASS__ . ' produce cd');
}
}
CDFactory1 需要联系CD内容供应商,走一遍流程,看一下哪些流程可以优化,这样第二家代工厂来获取授权的时候,就可以用直接按照第一家工厂优化过得流程执行
CDFactory2的代码和CDFactory1的代码一样。
class CDFactory2
{
static public function produce()
{
p('','Start:' . __CLASS__ . ' produce cd');
//装配内容
CD::instance()->content();
p('','End:' .__CLASS__ . ' produce cd');
}
}
我们来看执行结果:
Start:CDFactory1 produce cd
new intance:CD
授权CD内容:
End:CDFactory1 produce cd
Start:CDFactory2 produce cd"
授权CD内容:
End:CDFactory2 produce cd
我们可以看出来,只有CDFactory1执行的时候,我们new CD的对象,CDFactory2没有进行new 对象的操作,整个执行过程中,只执行了一次new 对象的操作,再次执行的时候,使用的是静态成员变量中存储的对象实例。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。