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发送邮件类代码附详细说明
Jul 10 PHP
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
Apr 02 PHP
php中使用Akismet防止垃圾评论的代码
Jun 10 PHP
PHP函数microtime()用法与说明
Dec 04 PHP
php使用curl检测网页是否被百度收录的示例分享
Jan 31 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 PHP
PHP实现简单实用的验证码类
Jul 29 PHP
浅谈php中urlencode与rawurlencode的区别
Sep 05 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
Apr 01 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
Laravel实现搜索的时候分页并携带参数
Oct 15 PHP
如何用Laravel包含你自己的帮助函数
May 27 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
SONY ICF-SW55的电路分析
2021/03/02 无线电
解析smarty 截取字符串函数 truncate的用法介绍
2013/06/20 PHP
基于PHP magic_quotes_gpc的使用方法详解
2013/06/24 PHP
Laravel 5框架学习之表单验证
2015/04/08 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
Jquery下的26个实用小技巧(jQuery tips, tricks &amp; solutions)
2010/03/01 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
jqTransform form表单美化插件使用方法
2012/07/05 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
js控制web打印(局部打印)方法整理
2013/05/29 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
javascript生成json数据简单示例分享
2014/02/14 Javascript
jQuery实现无限往下滚动效果代码
2016/04/16 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
2017/06/04 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python的SimpleHTTPServer模块用处及使用方法简介
2018/01/22 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
Python 调用 ES、Solr、Phoenix的示例代码
2020/11/23 Python
Django filter动态过滤与排序实现过程解析
2020/11/26 Python
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
工程管理造价应届生求职信
2013/11/13 职场文书
大学生职业规划前言模板
2013/12/27 职场文书
大学生自我评价范文分享
2014/02/21 职场文书
《和田的维吾尔》教学反思
2014/04/14 职场文书
优秀纪检干部材料
2014/08/27 职场文书
2014年电教工作总结
2014/12/19 职场文书
2019个人工作总结
2019/06/21 职场文书
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python