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 isset()与empty()的使用区别详解
Aug 29 PHP
PHP中数组的三种排序方法分享
May 07 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
Jan 19 PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 PHP
PHP 导出Excel示例分享
Aug 18 PHP
PHP生成不重复随机数的方法汇总
Nov 19 PHP
PHP的全局错误处理详解
Apr 25 PHP
php.ini中date.timezone设置详解
Nov 20 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 PHP
php实现每日签到功能
Nov 29 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 PHP
Laravel 5+ .env环境配置文件详解
Apr 06 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
Body是什么,该怎么喝出咖啡里的口感
2021/03/03 咖啡文化
PHP编码规范-php coding standard
2007/03/16 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
php微信公众号开发之欢迎老朋友
2018/10/20 PHP
通过身份证号得到出生日期和性别的js代码
2009/11/23 Javascript
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
JavaScript动态插入script的基本思路及实现函数
2013/11/11 Javascript
jQuery焦点控制图层展示延迟隐藏的方法
2015/03/09 Javascript
详解使用Next.js构建服务端渲染应用
2018/07/10 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
js实现点击生成随机div
2020/01/16 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
利用Psyco提升Python运行速度
2014/12/24 Python
python安装Scrapy图文教程
2017/08/14 Python
Python tkinter事件高级用法实例
2018/01/31 Python
python3的输入方式及多组输入方法
2018/10/17 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
python Selenium 库的使用技巧
2020/10/16 Python
奥地利领先的在线药房:SHOP APOTHEKE
2019/10/07 全球购物
俄罗斯卫浴采暖及维修用品超级市场:Dkrussia
2020/05/12 全球购物
介绍一下grep命令的使用
2012/06/28 面试题
会计毕业生求职简历的自我评价
2013/10/20 职场文书
信息技术专业个人自我评价
2013/12/11 职场文书
采购主管工作职责
2013/12/12 职场文书
商学院大学生求职的自我评价
2014/03/12 职场文书
创先争优活动承诺书
2014/08/30 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
2014年文秘工作总结
2014/11/25 职场文书
2014年工程工作总结
2014/11/25 职场文书
呐喊读书笔记
2015/06/30 职场文书
2015年秋季学校开学标语
2015/07/16 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
2021/05/05 Golang
mysql主从复制的实现步骤
2021/10/24 MySQL