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 相关文章推荐
使用adodb lite解决问题
Dec 31 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
Nov 01 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
Apr 25 PHP
php 启动报错如何解决
Jan 17 PHP
yii框架配置默认controller和action示例
Apr 30 PHP
php发送get、post请求的6种方法简明总结
Jul 08 PHP
PHP多维数组转一维数组的简单实现方法
Dec 23 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
Jan 07 PHP
php解析mht文件转换成html的实例
Mar 13 PHP
php-beanstalkd消息队列类实例分享
Jul 19 PHP
PHP whois查询类定义与用法示例
Apr 03 PHP
php 实现银联商务H5支付的示例代码
Oct 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 网页游戏开发入门教程一(webgame+design)
2009/10/26 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
是 WordPress 让 PHP 更流行了 而不是框架
2016/02/03 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
非常好用的JsonToString 方法 简单实例
2013/07/18 Javascript
js数字转换为float,取N位小数
2014/02/08 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
使用jquery Ajax实现上传附件功能
2018/10/23 jQuery
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
Python解析网页源代码中的115网盘链接实例
2014/09/30 Python
在Python的Django框架上部署ORM库的教程
2015/04/20 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
python numpy元素的区间查找方法
2018/11/14 Python
Python使用requests提交HTTP表单的方法
2018/12/26 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
html svg生成环形进度条的实现方法
2019/09/23 HTML / CSS
澳大利亚领先的美容护肤品零售商之一:SkincareStore
2018/01/22 全球购物
《翻越远方的大山》教学反思
2014/04/13 职场文书
学校运动会报道稿
2014/09/23 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
Mysql数据库命令大全
2021/05/26 MySQL
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript
MySQL事务的ACID特性以及并发问题方案
2022/07/15 MySQL