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 相关文章推荐
第十三节--对象串行化
Nov 16 PHP
自动生成文章摘要的代码[PHP 版本]
Mar 20 PHP
抓取并下载CSS中所有图片文件的php代码
Sep 26 PHP
基于session_unset与session_destroy的区别详解
Jun 03 PHP
php实现指定字符串中查找子字符串的方法
Mar 17 PHP
DEDECMS首页调用图片集里的多张图片
Jun 05 PHP
PHP实现加强版加密解密类实例
Jul 29 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
Mar 18 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
Nov 15 PHP
PHP AjaxForm提交图片上传并显示图片源码
Nov 29 PHP
PHP数据分析引擎计算余弦相似度算法示例
Aug 08 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
Aug 14 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
Get或Post提交值的非法数据处理
2006/10/09 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
Redis使用Eval多个键值自增的操作实例
2016/11/04 PHP
stream.js 一个很小、完全独立的Javascript类库
2011/10/28 Javascript
JavaScript实现表格排序方法
2013/06/14 Javascript
ie8本地图片上传预览示例代码
2014/01/12 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
基于javascript实现全屏漂浮广告
2016/03/31 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
Django+Vue实现WebSocket连接的示例代码
2019/05/28 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
2019/06/18 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
JavaScript函数柯里化实现原理及过程
2020/12/02 Javascript
python使用os模块的os.walk遍历文件夹示例
2014/01/27 Python
Python numpy 点数组去重的实例
2018/04/18 Python
利用Python实现在同一网络中的本地文件共享方法
2018/06/04 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
Python中字符串与编码示例代码
2019/05/20 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
Python之pymysql的使用小结
2019/07/01 Python
详解Django模版中加载静态文件配置方法
2019/07/21 Python
用django设置session过期时间的方法解析
2019/08/05 Python
学习Django知识点分享
2019/09/11 Python
TensorFlow 多元函数的极值实例
2020/02/10 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
2020/07/03 Python
Python下载的11种姿势(小结)
2020/11/18 Python
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
劳资专员岗位职责
2013/12/27 职场文书
高二政治教学反思
2014/02/01 职场文书
村容村貌整治方案
2014/05/21 职场文书
详解redis分布式锁的这些坑
2021/05/19 Redis