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 相关文章推荐
打造计数器DIY三步曲(中)
Oct 09 PHP
PHP学习之PHP变量
Oct 09 PHP
DISCUZ 分页代码
Jan 02 PHP
php 正确解码javascript中通过escape编码后的字符
Jan 28 PHP
phpmyadmin 常用选项设置详解版
Mar 07 PHP
php下将多个数组合并成一个数组的方法与实例代码
Feb 03 PHP
PHP实现变色验证码实例
Jan 06 PHP
php中随机函数mt_rand()与rand()性能对比分析
Dec 01 PHP
PHP Smarty模版简单使用方法
Mar 30 PHP
详解php用static方法的原因
Sep 12 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
Oct 09 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
Feb 11 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 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
使用Discuz关键词服务器实现PHP中文分词
2014/03/11 PHP
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
PHP设计模式之简单投诉页面实例
2016/02/24 PHP
iOS+PHP注册登录系统 PHP部分(上)
2016/12/26 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
IE6图片加载的一个BUG解决方法
2010/07/13 Javascript
Jquery index()方法 获取相应元素索引值
2012/10/12 Javascript
jquery遍历checkbox的注意事项说明
2014/02/21 Javascript
Javascript 实现复制(Copy)动作方法大全
2014/06/20 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
基于jquery实现图片上传本地预览功能
2016/01/08 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
微信小程序学习之数据处理详解
2017/07/05 Javascript
Angular指令之restict匹配模式的详解
2017/07/27 Javascript
基于JavaScript实现抽奖系统
2018/01/16 Javascript
Vue.js进阶知识点总结
2018/04/01 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
JavaScript类的继承方法小结【组合继承分析】
2018/07/11 Javascript
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
2019/05/18 Javascript
three.js利用射线Raycaster进行碰撞检测
2020/03/12 Javascript
Angular利用HTTP POST下载流文件的步骤记录
2020/07/26 Javascript
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
Django在pycharm下修改默认启动端口的方法
2019/07/26 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
python爬虫如何解决图片验证码
2021/02/14 Python
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
2014年教师培训的自我评价
2014/01/03 职场文书
大学生学业生涯规划
2014/01/05 职场文书
公司员工检讨书
2014/02/08 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
使用Redis实现实时排行榜功能
2021/07/02 Redis