原型模式(Prototype)
来源:互联网 发布:撒切尔夫人 香港知乎 编辑:程序博客网 时间:2024/06/05 11:22
<?php/** * 设计模式 一 原型模式 Prototype *//** * 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型达到创建新的对象目的。 * Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另一个可制定的对象, * 根本无需知道任何创建的细节。 * * 工作原理:通过一个原型对象传给 那个要发动创建的对象,这个要发动创建的对象是通过请求原型对象克隆原型对象自身。 * *//** * 优点: * 1、可以在运行时刻添加和删除产品 * 2、可以改变值以指定新对象。 * 3、可以改变结构以指定新对象。 * 4、减少子类构造。 * 5、用类动态配置应用。 * * 缺点: * 1、prototype模式的最主要缺点就是每个类必须配备一个克隆方法。 * 而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事。 * */ /** * 适用场景 * 1、当一个系统应该独立于它的产品创建、构成和表示时,要使用Prototype * 2、当要实例化的类是在运行时刻指定时,例如动态加载。 * 简历,星际小怪。 *//** * 抽象原型。 */abstract class Prototype {public abstract function clone();}class ConcreteAPrototype extends Prototype {public $name;public function __construct($name) {$this->name = $name;}public function getName() {return $this->name;}public function clone() {return clone $this;}}$p1 = new ConcreteAPrototype('lmq');$p2 = $p1->clone();var_export($p1);$p2->name = 'lmq2';var_export($p2);/** * 继续发展,由于原型对象比较多,需要一个原型管理类, */class PrototypeManager {private $_prototypeList = array();//增加原型,第一个参数为原型的名字,第二个参数为原型对象public function addPrototype($name, $prototype) {$this->_prototypeList[$name] = $prototype;}public function getPrototype($name) {return $this->_prototypeList[$name];}public function removePrototype($name) {return unset($this->_prototypeList[$name]);}//获取原型的克隆,也就是替代new的方法,参数为原型的名字public function getClone($name) {return clone $this->_prototypeList[$name];}} //初始化管理类$manager = new PrototypeManager();//初始化两个属于不同的原型$prototypeA = new ConcreteAPrototype('lmq');$prototypeB = new ConcreteAPrototype('lmq2'); //增加原型,同时用比较容易记忆的名字来命名原型$manager->addPrototype('p1', $prototypeA);$manager->addPrototype('p2', $prototypeB); //当需要新增对象的时候,我们可以不必知道对象的类名和初始化的工作$objcetA = $manager->getClone('p1');/* 我们一般用new来新增对象,不过很多时候新增一个对象需要一些工作。而星际里面往往会新增某些类的大量的对象,比如新增很多机枪兵和龙骑。 待解决的问题:我们能否减少new的使用,同时避免需要新增对象的时候,了解对象的类名。 思路:php5提供了克隆方法,我们可以新增一个对象,然后每次需要新增和她同类的对象,克隆他就可以了。 原型(Prototype)模式示例:*///机枪兵类class Marine { //所属的用户ID public $playerID //构造函数,参数为用户的id public function __construct($id) {$this->playerID = $id; }}//兵种的管理类class TroopManager {//数组,用于存放多个兵种的原型public $troopPrototype = array();//增加原型,第一个参数为原型的名字,第二个参数为原型对象public function addPrototype($name, $prototype) {$this->troopPrototype[$name] = $prototype;}//获取原型的克隆,也就是替代new的方法,参数为原型的名字public function getPrototype($name) {return clone $this->troopPrototype[$name];}} //初始化兵种的管理类$manager = new TroopManager();//初始化两个属于不同玩家的机枪兵的原型$m1 = new Marine(1);$m2 = new Marine(2);//增加原型,同时用比较容易记忆的名字来命名原型$manager->addPrototype('Marine of 1', $m1);$manager->addPrototype('Marine of 2', $m2);//当需要新增对象的时候,我们可以不必知道对象的类名和初始化的工作$m3 = $manager->getPrototype('Marine of 1');/*用途总结:原型模式可以将新增对象的工作细节封装。实现总结:需要一个原型管理类,实现增加和获取克隆原型的方法。注意这里由于为了简明,省略了一些东西,实际上我们可以在克隆方法上做一些改动,也可以用接口规范每个原型类。*/
设计模式目录
- 原型模式 Prototype模式
- 原型模式 Prototype模式
- 原型模式:prototype模式
- 原型模式 Prototype模式
- Prototype模式(原型模式)
- 原型模式:prototype模式
- 原型模式(Prototype)
- 原型模式(prototype)
- 原型(Prototype)模式
- 原型模式(Prototype Pattern)
- 原型(ProtoType)模式
- 原型模式(Prototype Pattern)
- 原型模式(Prototype Pattern)
- 原型模式 Prototype Pattern
- Prototype 原型模式
- 原型模式(Prototype)
- 原型模式 Prototype Pattern
- Prototype 原型模式
- Android中,SD卡上的媒体文件(图片、视频)的改变与通知
- 安卓Android开发视频培训材料介绍 Video2Brain Android 2
- 《第八周任务一-2》实现复数类中的运算符重载
- 虚拟机关闭redhat进入图形界面
- 【Android】对话框 AlertDialog
- 原型模式(Prototype)
- 1046 poj Color Me Less
- mysql备份
- C++中随机函数rand()的用法
- 第八周任务1-2
- HDOJ-2296 AC自动机+DP..一定要细心..
- matplotlib刻度
- POJ-1730 Perfect Pth Powers 解题报告(数论) 最大开方数
- 搞ACM的你伤不起啊