单例模式

单例模式,顾名思义:在执行过程中,只有一个实例,另外还需要提供一个可以随时可以访问它的全局。

他有几个典型的特征:

  • 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 对象的操作,再次执行的时候,使用的是静态成员变量中存储的对象实例。

你可能感兴趣的:(设计模式)