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安全配置
Oct 09 PHP
繁体中文转换为简体中文的PHP函数
Oct 09 PHP
smarty静态实验表明,网络上是错的~呵呵
Nov 25 PHP
PHP入门速成教程
Mar 19 PHP
ecshop 订单确认中显示省市地址信息的方法
Mar 15 PHP
php中使用explode查找某个字符是否存在的方法
Jul 12 PHP
PHP中全面阻止SQL注入式攻击分析小结
Jan 30 PHP
PHP 7的一些引人注目的新特性简单介绍
Nov 08 PHP
php数组函数array_key_exists()小结
Dec 10 PHP
php获取文件名称和扩展名的方法
Feb 07 PHP
php简单中奖算法(实例)
Aug 15 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
May 24 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设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
第三章 php操作符与控制结构代码
2011/12/30 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
PHP is_array() 检测变量是否是数组的实现方法
2016/06/13 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
Javascript 去除数组的重复元素
2010/05/04 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
利用json获取字符出现次数的代码
2012/03/22 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
详解vuejs几种不同组件(页面)间传值的方式
2017/06/01 Javascript
vue-cli中打包图片路径错误的解决方法
2017/10/26 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
2020/07/19 Javascript
Django框架下在URLconf中指定视图缓存的方法
2015/07/23 Python
Python 实现文件的全备份和差异备份详解
2016/12/27 Python
高质量Python代码编写的5个优化技巧
2017/11/16 Python
Python使用cx_Freeze库生成msi格式安装文件的方法
2018/07/10 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
2019/08/29 Python
详解python uiautomator2 watcher的使用方法
2019/09/09 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
web页面录屏实现
2019/02/12 HTML / CSS
安纳塔拉酒店度假村及水疗官方网站:Anantara Hotel
2016/08/25 全球购物
茶叶店创业计划书范文
2014/01/19 职场文书
旅游业大学生创业计划书
2014/01/31 职场文书
安全教育感言
2014/03/04 职场文书
好听的队名和口号
2014/06/09 职场文书
运输企业安全生产责任书
2014/07/28 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
关于实现中国梦的心得体会
2016/01/05 职场文书