PHP设计模式之原型设计模式原理与用法分析


Posted in PHP onApril 25, 2018

本文实例讲述了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() . '<br />';
    echo $employee->getId() . '<br />';
  }
}
$client = new Client();
?>

运行结果:

Tess Smith
sales
ts101-1234
Jacob Jones
promotion
jj101-2234
Ricky Rodrigues
operations
rr203-5634
Olivia perez
digital artwork
op302-1278
John Jackson
programming
jj301-1454

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
PHP生成随机用户名和密码的实现代码
Feb 27 PHP
PHP反射机制用法实例
Aug 28 PHP
Yii不依赖Model的表单生成器用法实例
Dec 04 PHP
php实现图片添加描边字和马赛克的方法
Dec 10 PHP
PHP中Memcache操作类及用法实例
Dec 12 PHP
ucenter通信原理分析
Jan 09 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
Aug 06 PHP
PHP PDOStatement::errorCode讲解
Jan 31 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
Apr 09 PHP
tp5递归 无限级分类详解
Oct 18 PHP
详解php中流行的rpc框架
May 29 PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 #PHP
PHP设计模式之工厂方法设计模式实例分析
Apr 25 #PHP
原生php实现excel文件读写的方法分析
Apr 25 #PHP
PHP操作Redis常用技巧总结
Apr 24 #PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
Apr 24 #PHP
PHP操作Postgresql封装类与应用完整实例
Apr 24 #PHP
php接口实现拖拽排序功能
Apr 23 #PHP
You might like
php xml文件操作代码(一)
2009/03/20 PHP
LotusPhp笔记之:Cookie组件的使用详解
2013/05/06 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
2013/06/24 PHP
php计算2个日期的差值函数分享
2015/02/02 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
PHP弱类型的安全问题详细总结
2016/09/25 PHP
使用php实现网站验证码功能【推荐】
2017/02/09 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
js日历功能对象
2012/01/12 Javascript
JS中完美兼容各大浏览器的scrolltop方法
2015/04/17 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
2016/08/31 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
在vue中使用jointjs的方法
2018/03/24 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
js tab栏切换代码实例解析
2019/09/03 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
JavaScript事件委托实现原理及优点进行
2020/08/29 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
apache部署python程序出现503错误的解决方法
2017/07/24 Python
PyQT5 QTableView显示绑定数据的实例详解
2019/06/25 Python
Python字典对象实现原理详解
2019/07/01 Python
python关于变量名的基础知识点
2020/03/03 Python
selenium+python配置chrome浏览器的选项的实现
2020/03/18 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
深入解析HTML5 Canvas控制图形矩阵变换的方法
2016/03/24 HTML / CSS
工作睡觉检讨书
2014/02/25 职场文书
幼儿园元旦家长感言
2014/02/27 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
离职信范文
2015/06/23 职场文书
三下乡活动心得体会
2016/01/23 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书