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中基本符号及使用方法
Mar 23 PHP
php float不四舍五入截取浮点型字符串方法总结
Oct 28 PHP
php中$_GET与$_POST过滤sql注入的方法
Nov 03 PHP
PHP、Java des加密解密实例
Apr 27 PHP
PHP读取PPT文件的方法
Dec 10 PHP
php图像处理函数imagecopyresampled用法详解
Dec 02 PHP
php制作基于xml的RSS订阅源功能示例
Feb 08 PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 PHP
PHP实现二维数组中的查找算法小结
Jun 09 PHP
PHP获取MySQL执行sql语句的查询时间方法
Aug 21 PHP
Laravel向公共模板赋值方法总结
Jun 25 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
Oct 03 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
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
并发下常见的加锁及锁的PHP具体实现代码
2010/10/12 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
2019/10/16 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
jQuery 打造动态渐变按钮 详细图文教程
2010/04/25 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
jQuery实现 注册时选择阅读条款 左右移动
2013/04/11 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
用js的document.write输出的广告无阻塞加载的方法
2014/06/05 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
javascript异步编程代码书写规范Promise学习笔记
2015/02/11 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
jQuery实现下拉框多选 jquery-multiselect 的实例代码
2016/07/14 Javascript
JavaScript反弹动画效果的实现代码
2017/07/13 Javascript
Angularjs上传文件组件flowjs功能
2017/08/07 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
vue动态绑定组件子父组件多表单验证功能的实现代码
2018/05/14 Javascript
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
vue和iview实现Scroll 数据无限滚动功能
2019/10/31 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
如何高效使用Python字典的方法详解
2017/08/31 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
Lacoste(法国鳄鱼)加拿大官网:以标志性的POLO衫而闻名
2019/05/15 全球购物
Strathberry苏贝瑞中国官网:西班牙高级工匠手工打造
2020/10/19 全球购物
设计专业毕业生求职信
2014/06/25 职场文书
医生党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书
导游词之凤凰古城
2019/10/22 职场文书
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android