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 相关文章推荐
PHP4实际应用经验篇(2)
Oct 09 PHP
非常不错的MySQL优化的8条经验
Mar 24 PHP
php strcmp使用说明
Apr 22 PHP
php下正则来匹配dede模板标签的代码
Aug 21 PHP
php从数组中随机抽取一些元素的代码
Nov 05 PHP
php中的ini配置原理详解
Oct 14 PHP
PHP抓取及分析网页的方法详解
Apr 26 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
Oct 08 PHP
PHP获取页面执行时间的方法(推荐)
Dec 10 PHP
PHP实现电商订单自动确认收货redis队列
May 17 PHP
PHP+JS实现的实时搜索提示功能
Mar 13 PHP
PHP实现打包zip并下载功能
Jun 12 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 转换字符串编码 iconv与mb_convert_encoding的区别说明
2011/11/10 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
2017/05/20 PHP
php语言注释,单行注释和多行注释
2018/01/21 PHP
php7 list()、session及其他模块的修改实例分析
2020/05/25 PHP
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
js中this对象用法分析
2018/01/05 Javascript
vue与bootstrap实现简单用户信息添加删除功能
2019/02/15 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
layui多iframe页面控制定时器运行的方法
2019/09/05 Javascript
vuex+axios+element-ui实现页面请求loading操作示例
2020/02/02 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
原生js实现贪吃蛇游戏
2020/10/26 Javascript
vue 导航守卫和axios拦截器有哪些区别
2020/12/19 Vue.js
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
python抓取文件夹的所有文件
2018/02/27 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
Ryderwear美国官网:澳大利亚高端健身训练装备品牌
2018/04/24 全球购物
LN-CC中国:高端男装和女装的奢侈时尚目的地
2019/09/14 全球购物
当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
2014/04/28 面试题
预防传染病方案
2014/06/14 职场文书
个人融资协议书
2014/10/02 职场文书
领导班子对照检查剖析材料
2014/10/13 职场文书
实习介绍信模板
2015/01/30 职场文书
上诉答辩状范文
2015/05/22 职场文书
员工规章制度范本
2015/08/07 职场文书
导游词之无锡古运河
2019/11/14 职场文书