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 Session变量不能传送到下一页的解决方法
Nov 27 PHP
php的ajax框架xajax入门与试用介绍
Dec 19 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
Nov 07 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
windwos下使用php连接oracle数据库的过程分享
May 26 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 PHP
详解js异步文件加载器
Jan 24 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
May 04 PHP
Yii2 assets清除缓存的方法
May 16 PHP
PHP定时任务获取微信access_token的方法
Oct 10 PHP
注释PHP和html混合代码的小技巧(分享)
Nov 03 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 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实现批量压缩图片文件大小的脚本
2014/07/04 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
jqPlot Option配置对象详解
2009/07/25 Javascript
Jquery下的26个实用小技巧(jQuery tips, tricks &amp; solutions)
2010/03/01 Javascript
kmock javascript 单元测试代码
2011/02/06 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
2014/03/28 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
2016/07/05 Javascript
canvas基础绘制-绚丽倒计时的实例
2017/09/17 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
Python采集腾讯新闻实例
2014/07/10 Python
Python类定义和类继承详解
2015/05/08 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
浅析python中numpy包中的argsort函数的使用
2018/08/30 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
python实现连连看辅助之图像识别延伸
2019/07/17 Python
Python使用matplotlib实现交换式图形显示功能示例
2019/09/06 Python
python ctypes库2_指定参数类型和返回类型详解
2019/11/19 Python
浅谈keras的深度模型训练过程及结果记录方式
2020/01/24 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
python3 实现口罩抽签的功能
2020/03/11 Python
如何利用python正则表达式匹配版本信息
2020/12/09 Python
新西兰领先的内衣店:Bendon Lingerie新西兰
2018/07/11 全球购物
创业计划书如何编写
2014/02/06 职场文书
音乐专业自荐信
2014/02/07 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
学校安全管理制度
2015/08/06 职场文书
高一数学教学反思
2016/02/18 职场文书
python字典进行运算原理及实例分享
2021/08/02 Python
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android