一、什么是原型设计模式

  原型设计模式使用一种克隆技术来复制实例化的对象,新对象是通过复制原型实例创建的。原型设计模式的目的是通过使用克隆以减少

实例化对象的开销。

  在原型设计模式中,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设计模式三:原型设计模式的更多相关文章

  1. Java设计模式之原型设计模式

    概述 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式 ...

  2. C#设计模式(6)——原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  3. Java设计模式05:常用设计模式之原型模式(创建型模式)

    1. Java之原型模式(Prototype Pattern)     原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. ...

  4. C#设计模式之六原型模式(Prototype)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  5. C#设计模式之五原型模式(Prototype Pattern)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  6. C#设计模式(6)——原型模式(Prototype Pattern)(转)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  7. C#设计模式(6)——原型模式(Prototype Pattern) C# 深浅复制 MemberwiseClone

    C#设计模式(6)——原型模式(Prototype Pattern)   一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创 ...

  8. 设计模式之原型(prototype)模式

    相信大多数的人都看过<西游记>,对孙悟空拔毛变出小猴子的故事情节应该都很熟悉.孙悟空可以用猴毛根据自己的形象复制出很多跟自己一模一样的小猴兵出来,其实在设计模式中也有一个类似的模式,我们可 ...

  9. 原型设计模式(prototype

    # 什么是原型设计模式 > 这里与软件工程中的原型开发模式有那么一点类似的地方,我们首先需要构建出一个原型,这个原型可以在现实开发中抽象出来的具体类型,但是这个类型与具体的类又不同,需要抽取公共 ...

随机推荐

  1. Spring Boot Maven Plugin(二):run目标

    简介 Spring Boot Maven Plugin插件提供spring boot在maven中的支持.允许你打包可运行的jar包或war包. 插件提供了几个maven目标和Spring Boot ...

  2. Ajax【介绍、入门、解决Ajax中文、跨域、缓存】

    什么是Ajax Ajax(Asynchronous JavaScript and XML) 异步JavaScript和XML Ajax实际上是下面这几种技术的融合: (1)XHTML和CSS的基于标准 ...

  3. 利用ADO让普通人用excel读取oracle数据库表的通用办法

    Ref:http://blog.csdn.net/iamlaosong/article/details/8465177 Excel通过ADO方式连接到Oracle并操作Oracle给那些编程能力不强的 ...

  4. QT4.8.5 连接数据库(读写数据)

    #include "mainwindow.h" #include <QApplication> #include <QLabel> #include < ...

  5. Android 之JDBC

    JDBC(Java DataBase Connectivity)是使用 Java 存取数据库系统的标准解决方案,它将不同数据库间各自差异API与标准 SQL语句分开看待,实现数据库无关的 Java操作 ...

  6. CDS测试框架介绍:如何为ABAP CDS Entities写测试

    动机 现在大家都知道单元测试对我们代码的好处.并且我们都承认它是开发过程中不可或缺的一部分.但是在把代码切换到数据库的模式下的时候,我们被粗暴地打回了软件测试的黑暗年代...我们现在面临着逻辑下推到A ...

  7. 判断字符串中是否包含指定的内容&&字符串截取方法比较说明

    1.使用indexOf()方法 方法说明: 作用:indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置(从前向后查找). 语法:stringObject.indexOf(searc ...

  8. mybatis快速入门(五)

    今天写写user表和orders表的mybatis的高级映射,一对一映射和一对多映射 1.创建一个orders.java文件 1.1一对一映射,一条订单对应一个用户 package cn.my.myb ...

  9. ElasticSearch入门(3) —— head插件

    #### 安装ES head插件 具体请参考github地址:https://github.com/mobz/elasticsearch-head 使用 安装Install # 在线安装head插件 ...

  10. Charles Proxy v4.1.4 免费注册激活方法

    去官网下载最新版Charles,目前是v4.1.4 下载后安装Charles,然后先打开一次Charles软件(Mac系统需要先打开一次,Windows不需要) 到网站 http://charles. ...