美文网首页
PHP设计模式:原型模式

PHP设计模式:原型模式

作者: Zed_790e | 来源:发表于2019-06-19 17:19 被阅读0次

    前言

    原型模式用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

    代码

    //定义一个巨大的文本类(假设创建它的时候内存消耗很大QWQ)
    class Company
    {
        private $company;
    
        public function setName($name)
        {
            $this->company = $name;
        }
    
        public function getName()
        {
            return $this->company;
        }
    }
    
    //这个类主要用来做逻辑
    class Archives
    {
        private $name;
        private $sex;
        private $age;
        private $work;
        private $company;
    
        //构造函数加载一次那个巨大的类 (重点)
        function __construct()
        {
            $this->company = new Company();
        }
    
        public function setInfo($name, $sex, $age)
        {
            $this->name = $name;
            $this->sex = $sex;
            $this->age = $age;
        }
    
        public function setWork($company, $work)
        {
            $this->work = $work;
            $this->company->setName($company);
        }
    
        public function show()
        {
            echo $this->name . " " . $this->sex . " " . $this->age . "\n";
            echo $this->work . " " . $this->company->getName() . "\n";
        }
    
        // 对引用执行深复制(重点)
        function __clone()
        {
            $this->company = clone $this->company;
        }
    }
    
    $resume = new Archives("蛇精病俱乐部");
    $resume->setInfo("张小帅", "男", 24);
    $resume->setWork("WEB开发部", "PHP工程师");
    
    $resume2 = clone $resume;
    $resume2->setInfo("王明明", "男", 40);
    $resume2->setWork("WEB开发部", "产品经理");
    
    $resume3 = clone $resume2;
    $resume3->setInfo("孙苦苦", "女", 18);
    $resume3->setWork("WEB开发部", "程序员鼓励师");
    
    $resume->show();
    $resume2->show();
    $resume3->show();
    

    输出

    image.png

    总结

    说白了原型模式就是克隆的一种玩法,不需要想象的太过于复杂。简单来说他就是克隆!

    相关文章

      网友评论

          本文标题:PHP设计模式:原型模式

          本文链接:https://www.haomeiwen.com/subject/auakqctx.html