多例模式

上篇文章,咱们说过了单例模式,有童鞋会问:有单例,是否是有多例?答案:是的,这篇文章,咱们来聊一下多例模式。数据库

多例模式,就是一个类有多个实例,并且该实例都是该类自己。这样的类叫作多例类,具备如下:设计模式

  • 多例类能够有多个实例。
  • 多例类必须本身建立、管理本身的实例,并向外界提供本身的实例。

简单啰嗦一句,跟普通咱们new对象不同,咱们能够屡次new对象,可是每次new的对象都是一个新的对象;而多例类里面全部的实例都是该类自己。数组

下面咱们来看一下具体的代码实现:
逻辑:CD工厂要不不一样的内容受权给不一样的工厂去生产:把CD1的内容让工厂1生产;CD2的内容让工厂2生产。这样能够减小CD工厂的数量,增长CD工厂的扩展性。函数

class CDFactory
{
    /**
     * 实例对象数组
     *
     * @var array
     */
    private static $_instances = [];
    
    /**
     * 构造函数私有,防止类能够经过 new 实例化
     *
     * @access private
     * @return void
     */
    private function __construct ()
    {
    
    }
    
    /**
     * 私有化复制克隆方法,防止类别复制和克隆
     *
     * @access private
     * @return void
     */
    private function __clone ()
    {
    
    }
    
    /**
     * 阻止实例被序列化
     *
     * @access private
     * @return void
     */
    private function __wakeup ()
    {
    }
    
    /**
     * 定义获取对象实例的入口,返回该实例
     *
     * @access public
     * @param string $name 实例化名字
     * @return self
     */
    public static function getInstance (string $name)
    {
        // 判断是否已经存在实例化对象
        if (!isset(self::$_instances[$name]))
        {
            p('new intance:' . __CLASS__);
            
            // 不存在,则实例化一个
            self::$_instances[$name] = new self();
        }
        
        return self::$_instances[$name];
    }
    
    /**
     * 此接口用来测试单例模式 - 改变 string 的值
     *
     * @access public
     * @param string $string 值
     * @return void
     */
    public function setContent($string)
    {
        $this->string = $string;
    }
    
    /**
     * 此接口用来测试单例模式 - 输出 string 的值
     *
     * @access public
     * @return void
     */
    public function getContent()
    {
        p('$this->string',$this->string);
    }
}

调用的代码:测试

class Client
{
    static public function factory1Produce()
    {
        $cd = CDFactory::getInstance('CD1');
    
        $cd->setContent('CD 1 内容~');
        
        return $cd;
    }
    
    static public function factory2Produce()
    {
        $cd = CDFactory::getInstance('CD2');
        
        $cd->setContent('CD 2 内容~');
        
        return $cd;
    }
    
    /**
     * 主函数
     */
    static public function main()
    {
        //工厂1生产
        $cd_1 = static::factory1Produce();
        
        $cd_1->getContent();
        
        //工厂2生产
        $cd_2 = static::factory2Produce();
        
        $cd_2->getContent();
    }
}

执行结果:this

new intance:CDFactory
$this->string=
string(12) "CD 1 内容~"
new intance:CDFactory
$this->string=
string(12) "CD 2 内容~"

执行结果里面咱们能够看到,new intance:CDFactory调用了两次,实现了一个类有多个实例,由于咱们的实例是存在 $_instances 数组中,因此每次new intance又都是CD类自己。设计

在实际应用中,多例模式能够用在处理多个数据库链接器等类似功能,可是不一样实例的状况。code

多例模式和单例模式是比较简单的设计模式,同时也是被常常使用的设计模式,尤为是单例模式,好比 ThinkPHP中的Cache就是用的多例模式,可是Redis链接的处理就是用的单例模式。对象

相关文章
相关标签/搜索