zoukankan      html  css  js  c++  java
  • C4:原型模式 Prototype

    用原型实例指定创建对象的种类,并且拷贝这些原型创建新的对象.
    应用场景:

    A.用new创建对象通常有较为复杂的数据准备或权限准备
    B.对象较大,拷贝对象可以节省内存

    UML图:

    class WorkExperience
    {
        private $workTime;
        private $workAddress;
    
        public function __construct($workTime, $workAddress)
        {
            $this->workTime = $workTime;
            $this->workAddress = $workAddress;
        }
    
        /**
         * @return mixed
         */
        public function getWorkTime()
        {
            return $this->workTime;
        }
    
        /**
         * @return mixed
         */
        public function getWorkAddress()
        {
            return $this->workAddress;
        }
    
        /**
         * @param mixed $workTime
         */
        public function setWorkTime($workTime)
        {
            $this->workTime = $workTime;
        }
    
        /**
         * @param mixed $workAddress
         */
        public function setWorkAddress($workAddress)
        {
            $this->workAddress = $workAddress;
        }
    
    
    
    }
    
    abstract class Prototype
    {
        protected $age;
        protected $name;
        protected $workExperience;
    
        public function __clone() {
            $this->workExperience = clone $this->workExperience; //将对象深拷贝
        }
    }
    
    
    class Resume extends Prototype
    {
        public function __construct($name)
        {
            $this->name = $name;
        }
    
    
        /**
         * @return mixed
         */
        public function getAge()
        {
            return $this->age;
        }
    
        /**
         * @param mixed $age
         */
        public function setAge($age)
        {
            $this->age = $age;
        }
    
        /**
         * @return mixed
         */
        public function getName()
        {
            return $this->name;
        }
    
        /**
         * @param mixed $name
         */
        public function setName($name)
        {
            $this->name = $name;
        }
    
        /**
         * @return mixed
         */
        public function getWorkExperience()
        {
            return $this->workExperience;
        }
    
        /**
         * @param mixed $workExperience
         */
        public function setWorkExperience(WorkExperience $workExperience)
        {
            $this->workExperience = $workExperience;
        }
    }
    
    $workExp = new WorkExperience('2013-2015', ' A commpany');
    
    $resumeA = new Resume("jack");
    $resumeA->setAge(23);
    $resumeA->setWorkExperience($workExp);
    
    $resumeB = clone $resumeA;
    $workExp->setWorkTime('2016-2017');
    $resumeA->setWorkExperience($workExp);
    
    echo $resumeA->getName() . PHP_EOL;
    echo $resumeA->getAge() . PHP_EOL;
    echo $resumeA->getWorkExperience()->getWorkTime() ;
    echo $resumeA->getWorkExperience()->getWorkAddress() . PHP_EOL;
    echo $resumeB->getWorkExperience()->getWorkTime() ;
    echo $resumeB->getWorkExperience()->getWorkAddress() . PHP_EOL;
    

      

  • 相关阅读:
    Oracle11g客户端安装记要202011+Navicat Premium 连接Oracle 数据库
    设计模式之 ==> 观察者计模式
    设计模式之 ==> 责任链计模式
    一个.NET Core下的开源插件框架
    JavaScript判断文件是否为UTF-8编码
    Postgresql 设置字段搜索支持中文排序
    springboot docker 显示中文乱码问题
    linux 更新系统时间
    怎么让网易云音乐等音乐软件的歌词在MacBook Pro的 touch bar(触摸栏)上显示
    数仓:解读 NameNode 的 edits 和 fsimage 文件内容
  • 原文地址:https://www.cnblogs.com/itfenqing/p/7786913.html
Copyright © 2011-2022 走看看