PHP设计模式三:原型设计模式
一、什么是原型设计模式
原型设计模式使用一种克隆技术来复制实例化的对象,新对象是通过复制原型实例创建的。原型设计模式的目的是通过使用克隆以减少
实例化对象的开销。
在原型设计模式中,Client类是不可缺少的一部分。
PHP有一个内置的克隆方法__clone()可以在设计模式中使用,但是不能直接访问,使用clone关键字即可。克隆不会启动构造函数。
二、什么时候使用原型设计模式
如果一个项目要求你创建某个原型对象的多个实例,就可以使用原型设计模式。
三、原型设计模式实例
这里以现代企业组织为例:
<?php
/**
* 原型设计模式
* 以现代企业组织为例
**/ //部门抽象类
abstract class IAcmePrototype
{
protected $id; //员工ID号
protected $name; //员工名字
protected $dept; //员工部门 //克隆方法
abstract function __clone(); //员工部门设置方法
abstract function setDept($orgCode);
//员工部门获取方法
public function getDept()
{
return $this->dept;
} //员工ID号设置方法
public function setId($id)
{
$this->id = $id;
}
//员工ID号获取方法
public function getId()
{
return $this->id;
} //员工名字设置方法
public function setName($name)
{
$this->name = $name;
}
//员工名字获取方法
public function getName()
{
return $this->name;
}
} //市场部类
class Marketing extends IAcmePrototype
{
const UNIT = "Marketing"; //标识 //市场部门类别
private $sales = "sales";
private $promotion = "promotion";
private $strategic = "strategic planning"; //克隆函数
function __clone()
{
} //部门设置函数
public function setDept($orgCode)
{
switch($orgCode)
{
case 101:
$this->dept = $this->sales;
break;
case 102:
$this->dept = $this->promotion;
break;
case 103:
$this->dept = $this->strategic;
break;
default:
$this->dept = "Unrecognized Marketing";
}
}
} //管理部类
class Management extends IAcmePrototype
{
const UNIT = "Management";
private $research = "research";
private $plan = "planning";
private $operations = "operations"; function __clone()
{
} public function setDept($orgCode)
{
switch($orgCode)
{
case 201:
$this->dept = $this->research;
break;
case 202:
$this->dept = $this->plan;
break;
case 203:
$this->dept = $this->operations;
break;
default:
$this->dept = "Unrecognized Marketing";
}
}
} //工厂部类
class Engineering extends IAcmePrototype
{
const UNIT = "Engineering";
private $development = "programming";
private $design = "digital artwork";
private $sysAd = "system administration"; function __clone()
{
} public function setDept($orgCode)
{
switch($orgCode)
{
case 301:
$this->dept = $this->development;
break;
case 302:
$this->dept = $this->design;
break;
case 303:
$this->dept = $this->sysAd;
break;
default:
$this->dept = "Unrecognized Marketing";
}
}
} //客户类
class Client
{
private $market; //市场部类实例
private $manage; //管理部类实例
private $engineer; //工厂部类实例 //构造函数
public function __construct()
{
$this->makeConProto(); //市场部类实例克隆
$Tess = clone $this->market;
$this->setEmployee($Tess,"Tess Smith",101,"ts101-1234");
$this->showEmployee($Tess); $Jacob = clone $this->market;
$this->setEmployee($Jacob,"Jacob Jones",102,"jj101-2234");
$this->showEmployee($Jacob); //管理部类实例克隆
$Ricky = clone $this->manage;
$this->setEmployee($Ricky,"Ricky Rodrigues",203,"rr203-5634");
$this->showEmployee($Ricky); //工程部类实例克隆
$Olivia = clone $this->engineer;
$this->setEmployee($Olivia,"Olivia perez",302,"op302-1278");
$this->showEmployee($Olivia); $John = clone $this->engineer;
$this->setEmployee($John,"John Jackson",301,"jj301-1454");
$this->showEmployee($John);
} //实例化部门对象
private function makeConProto()
{
$this->market = new Marketing();
$this->manage = new Management();
$this->engineer = new Engineering();
} //员工信息设置方法
private function setEmployee(IAcmePrototype $employee,$name,$dept,$id)
{
$employee->setName($name);
$employee->setDept($dept);
$employee->setId($id);
} //员工信息显示方法
private function showEmployee(IAcmePrototype $employee)
{
echo $employee->getName() . '<br />';
echo $employee->getDept() . ": " . $employee::UNIT . '<br />';
echo $employee->getId() . '<br />';
}
} $client = new Client();
?>
PHP设计模式三:原型设计模式的更多相关文章
- Java设计模式之原型设计模式
概述 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式 ...
- C#设计模式(6)——原型模式(Prototype Pattern)
一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...
- Java设计模式05:常用设计模式之原型模式(创建型模式)
1. Java之原型模式(Prototype Pattern) 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. ...
- C#设计模式之六原型模式(Prototype)【创建型】
一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...
- C#设计模式之五原型模式(Prototype Pattern)【创建型】
一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...
- C#设计模式(6)——原型模式(Prototype Pattern)(转)
一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...
- C#设计模式(6)——原型模式(Prototype Pattern) C# 深浅复制 MemberwiseClone
C#设计模式(6)——原型模式(Prototype Pattern) 一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创 ...
- 设计模式之原型(prototype)模式
相信大多数的人都看过<西游记>,对孙悟空拔毛变出小猴子的故事情节应该都很熟悉.孙悟空可以用猴毛根据自己的形象复制出很多跟自己一模一样的小猴兵出来,其实在设计模式中也有一个类似的模式,我们可 ...
- 原型设计模式(prototype
# 什么是原型设计模式 > 这里与软件工程中的原型开发模式有那么一点类似的地方,我们首先需要构建出一个原型,这个原型可以在现实开发中抽象出来的具体类型,但是这个类型与具体的类又不同,需要抽取公共 ...
随机推荐
- 王者荣耀是怎样炼成的(二)《王者荣耀》unity安装及使用的小白零基础入门
转载请注明出处:http://www.cnblogs.com/yuxiuyan/p/7535345.html 工欲善其事,必先利其器. 上回书说到,开发游戏用到unity和C#.本篇博客将从零开始做一 ...
- Java报文或者同步的数据有个别乱码情况的处理.
从其它系统获取到的用户数据,1万多条数据有其中有2条数据是乱码形式,这种形式表现为最后一个字符和本身的分隔符组成了一个乱码 错误数据 : 220296|+|黄燕 鄚+|7|+|7|+|02220 ...
- ops-web运维平台data.jsp-jquery-mootools
data.jsp页面, 下面列出的是 <body>部分 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang=& ...
- 超简单的js评价小星星
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Struts访问的时候出现request=null的情况
今天用Struts框架写个小应用的时候,出现了如下问题 private File upload; private String uploadContentType; private Str ...
- 将数组分割为几个等长度的子数组(使用slice)
先了解一下slice方法: slice() 1.定义:slice()可从已有数组中截取返回指定的元素,形成一个新的数组: 语法:arrayObject.slice(start,end): 参数 描述 ...
- mybatis(三)
上面2章写了mybatis的基本操作,今天就写写mybatis的动态代理吧. 动态代理有4个基本原则: 1.userMapper.xml里面的namespace="cn.my.dao.Use ...
- 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ---简介
这一章描述如何初始化一个新线程,如何停止一个执行中的线程,以及如何了解并调整线程优先权. 读过这一章之后,你将有能力回答一个 Win32 多线程程序设计的最基本问题.你一定曾经在 Usenet ...
- linux cpu load学习笔记
linux系统中的Load对当前CPU工作量的度量 Load Average 就是一段时间 (1 分钟.5分钟.15分钟) 内平均Load. [root@CNC-BJ-5-3N1 ~]# w 20:0 ...
- Python统计列表中的重复项出现的次数的方法
本文实例展示了Python统计列表中的重复项出现的次数的方法,是一个很实用的功能,适合Python初学者学习借鉴.具体方法如下:对一个列表,比如[1,2,2,2,2,3,3,3,4,4,4,4],现在 ...