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 相关文章推荐
新版mysql+apache+php Linux安装指南
Oct 09 PHP
网页游戏开发入门教程三(简单程序应用)
Nov 02 PHP
phpmyadmin里面导入sql语句格式的大量数据的方法
Jun 05 PHP
PHP 计算代码执行耗时的代码修正网上普遍错误
May 14 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
Oct 23 PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
Dec 28 PHP
那些年一起学习的PHP(一)
Mar 21 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
Sep 23 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
Aug 01 PHP
PHP封装的XML简单操作类完整实例
Nov 13 PHP
PHP空值检测函数与方法汇总
Nov 19 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
Dec 05 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 无限极分类
2008/03/27 PHP
PHP 处理图片的类实现代码
2009/10/23 PHP
PHP缩略图生成和图片水印制作
2017/01/07 PHP
JavaScript实现禁止后退的方法
2006/12/27 Javascript
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
js+数组实现网页上显示时间/星期几的实用方法
2013/01/18 Javascript
js onload事件不起作用示例分析
2013/10/09 Javascript
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
解读Bootstrap v4 sass设计
2016/05/29 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
Ajax跨域实现代码(后台jsp)
2017/01/21 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
vue-cli3项目展示本地Markdown文件的方法
2019/06/07 Javascript
最简单的vue消息提示全局组件的方法
2019/06/16 Javascript
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
2015/06/28 Python
Python AES加密模块用法分析
2017/05/22 Python
python对DICOM图像的读取方法详解
2017/07/17 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
python3人脸识别的两种方法
2019/04/25 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
python使用matplotlib绘制雷达图
2019/10/18 Python
详解python中的lambda与sorted函数
2020/09/04 Python
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
精选干货:Java精选笔试题附答案
2014/01/18 面试题
房产授权委托书范本
2014/09/22 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
大学生助学金感谢信
2015/01/21 职场文书
护士自荐信范文
2015/03/25 职场文书