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 模板高级篇总结
Dec 21 PHP
PHP 批量删除数据的方法分析
Oct 30 PHP
php UTF-8、Unicode和BOM问题
May 18 PHP
PHP教程之PHP中shell脚本的使用方法分享
Feb 23 PHP
php中导出数据到excel时数字变为科学计数的解决方法
Feb 03 PHP
在yii中新增一个用户验证的方法详解
Jun 20 PHP
php实现XSS安全过滤的方法
Jul 29 PHP
Yii中CGridView禁止列排序的设置方法
Jul 12 PHP
PHP实现的多维数组去重操作示例
Jul 21 PHP
PHP上传文件及图片到七牛的方法
Jul 25 PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
Apr 04 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算开始时间到过期时间的相隔的天数
2011/01/12 PHP
yii2中添加验证码的实现方法
2016/01/09 PHP
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
表单元素事件 (Form Element Events)
2009/07/17 Javascript
JQuery的html(data)方法与&amp;lt;script&amp;gt;脚本块的解决方法
2010/03/09 Javascript
JavaScript中的私有/静态属性介绍
2012/07/26 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
JQuery 使用attr方法实现下拉列表选中
2014/10/13 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
实例详解display:none与visible:hidden的区别
2017/03/30 Javascript
Async Validator 异步验证使用说明
2017/07/03 Javascript
js最简单的双向绑定实例讲解
2018/01/02 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
JSON是什么?有哪些优点?JSON和XML的区别?
2019/04/29 Javascript
微信小程序自定义多列选择器使用详解
2019/06/21 Javascript
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
python实现探测socket和web服务示例
2014/03/28 Python
python中stdout输出不缓存的设置方法
2014/05/29 Python
python开发之thread线程基础实例入门
2015/11/11 Python
Python脚本实现12306火车票查询系统
2016/09/30 Python
解决python3 网络请求路径包含中文的问题
2018/05/10 Python
python制作简单五子棋游戏
2019/06/18 Python
Python转换时间的图文方法
2019/07/01 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
python使用Word2Vec进行情感分析解析
2020/07/31 Python
超级实用的8个Python列表技巧
2020/08/24 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
乌克兰在线商店的价格比较:Price.ua
2019/07/26 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
电力公司个人求职信范文
2014/02/04 职场文书
优秀教师个人材料
2014/12/15 职场文书
入党群众意见范文
2015/06/02 职场文书
校运会通讯稿
2015/07/18 职场文书
实验心得体会范文
2016/01/25 职场文书
MySQL单表千万级数据处理的思路分享
2021/06/05 MySQL