摘要:原型设计模式中,原型设计模式的关键是要了解如何使用内置函数抽象原型角色声明一个克隆自身的接口具体原型角色实现一个克隆自身的操作原型设计模式的目的通过克隆以减少实例化对象的开销,与其实例化新对象,完全可以使用一个已有实例的克隆注意类是原型设计
原型设计模式
Notice:
PHP中,原型设计模式的关键是要了解如何使用内置函数__clone()
抽象原型角色(Prototype):声明一个克隆自身的接口
具体原型角色(ConcretePrototype):实现一个克隆自身的操作
原型设计模式的目的: 通过克隆以减少实例化对象的开销,与其实例化新对象,完全可以使用一个已有实例的克隆
注意Client类是原型设计模式中不可缺少的一部分
模型:
如果一个项目要求你创建某个原型对象的多个实例,就可以使用原型设计模式
原型模式还可以用来创建一种组织结构,可以根据实际的组织来创建和填充其中的位置
克隆与构造函数克隆不会启动构造函数中的动作,但是可以进行赋值之类的操作,比如$this->act = "action" 这样的操作会被执行,但是如果要"print $this->act",那么这个打印的动作将不会被执行
这就意味着原型设计模式不能依赖于构造函数提供重要的输出或返回结果
构造函数不要做具体的工作,如果一个类实例化要完成大量初始化,结果往往不灵活,而且这是过渡耦合的设计
并不是说构造函数不能根据需要赋值,而是它与模式中其它参与者不同,因为它需要向参与者做出请求
使用__clone()函数存在限制,但这些限制可能更有助于完成更好的OOP程序
下面用一个基于OOP的实例来解释原型模式
name = $emName; } public function getName() { return $this->name; } // ID public function setId($emId) { $this->id = $emId; } public function getId() { return $this->id; } // Name public function setPic($ePic) { $this->employeePic = $ePic; } public function getPic() { return $this->employeePic; } abstract function __clone(); } ?>
dept = $this->sales; break; case 102: $this->dept = $this->promotion; break; case 103: $this->dept = $this->strategic; break; default: $this->dept = "Unreconized Marketing"; } } public function getDept(){ return $this->dept; } function __clone(){} } ?>
makeConProto(); //实例化市场类、管理类、工程类 $Tess = clone $this->market; //将刚实例化的市场类克隆过来 $this->setEmployee($Tess, "Tess Smith", 101, "ts101-1234", "/tess.png"); //设置雇员的信息 $this->showEmployee($Tess); //展示雇员的信息,根据方法所要求的传递一个对象进去 $Jacob = clone $this->market; $this->setEmployee($Jacob, "Jacob Jones", 102, "jj101-2234", "/jacob.png"); $this->showEmployee($Jacob); $Ricky = clone $this->manage; $this->setEmployee($Ricky, "Ricky Rodrigues", 203, "rr203-5634", "/ricky.png"); $this->showEmployee($Ricky); $Olivia = clone $this->engineer; $this->setEmployee($Olivia, "Olivia Perez", 302, "op301-1278", "/olivia.png"); $this->showEmployee($Olivia); $John = clone $this->engineer; $this->setEmployee($John, "John Smith", 301, "jj302-1454", "/john.png"); $this->showEmployee($John); } private function makeConProto() { $this->market = new Marketing(); $this->manage = new Management(); $this->engineer = new Engineering(); } private function showEmployee(IAcmePrototype $employeeNow) { $pic = $employeeNow->getPic(); //获取雇员的图片路径 echo ""; echo $employeeNow->getName() . "
"; echo $employeeNow->getDept() . ":" . $employeeNow::UNIT . "
"; echo $employeeNow->getId() . ""; } private function setEmployee(IAcmePrototype $employeeNow, $nm, $dp, $id, $pic) { //根据传递进来的值,设置雇员的姓名、部门、id以及图片的路径 //这里是调用了从父类中继承过来的方法、以及自身的方法 $employeeNow->setName($nm); $employeeNow->setDept($dp); $employeeNow->setId($id); $employeeNow->setPic("$pic"); } } $worker = new Client(); ?>
上面我省略了engineer类和Management类,你可以根据Marketing直接复制然后进行修改
PS:本文参考书籍:《Learning PHP设计模式》第2部分第6章
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/21262.html
摘要:维基百科有对这类模式的定义在软件工程中,创建型模式是处理对象对象计算机科学创建的设计模式设计模式计算机,试图根据实际情况使用合适的方式创建对象。接下来本文将继续介绍创建型模式中的另两种模式建造者模式和原型模式,文中的代码已托管在上。 前言 前两篇文章介绍了单例模式和工厂模式,这两种设计模式实际上都属于软件工程中的创建型模式(Creational Pattern)。维基百科有对这类模式的...
摘要:内部迭代与使用迭代器显式迭代的集合不同,流的迭代操作是在背后进行的。流只能遍历一次请注意,和迭代器类似,流只能遍历一次。 流(Stream) 流是什么 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。就现在来说,你可以把它们看成遍历数据集的高级迭代器。此外,流还可以透明地并行处理,你无需写任何多线程代码了!我会在后面的笔记中...
摘要:继续分享设计模式的公开课,这是第四篇创建型模式之原型模式设计模式的一般介绍在第一篇文章讲了,不了解的可以先看看。设计模式的第一部分,创建型模式就总结完了。下面还有两部分结构型设计模式和行为型设计模式稍后继续。 继续分享设计模式的公开课,这是第四篇创建型模式之原型模式 设计模式的一般介绍在第一篇文章讲了,不了解的可以先看看。 原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这个...
摘要:我们分三篇文章来总结一下设计模式在中的应用,这是第一篇创建型模式。二提炼设计模式的几个原则开闭原则模块应对扩展开放,而对修改关闭。工厂模式实现定义一个用于创建对象的接口,让子类决定实例化哪一个类。设计模式的第一部分,创建型模式就总结完了。 我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使...
摘要:利用工厂方法模式,请求者发出请求,而不具体创建产品。正是因为这个原因,使用工厂方法模式可以简化复杂的创建过程,关键就在于它在维持一个公共接口。 创建型设计模式 包括以下五种: 抽象工厂 生成器 工厂方法 原型 单例 我们选择工厂方法和原型模式作为将用PHP实现的创建型设计的例子工厂方法模式是这5个设计模式中唯一的一种类设计模式原型模式属于对象类模式,可以使用PHP_clone方法实...
阅读 1356·2021-11-22 15:25
阅读 3350·2021-10-21 09:38
阅读 1563·2021-10-19 13:21
阅读 991·2021-09-06 15:00
阅读 1673·2019-08-30 15:44
阅读 2576·2019-08-29 15:40
阅读 3431·2019-08-29 13:44
阅读 2023·2019-08-26 16:56