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 Memcached + APC + 文件缓存封装实现代码
Mar 11 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
Oct 15 PHP
PHP设计模式 注册表模式
Feb 05 PHP
PHP用身份证号获取星座和生肖的方法
Nov 07 PHP
phpQuery占用内存过多的处理方法
Nov 13 PHP
php查询mysql大量数据造成内存不足的解决方法
Mar 04 PHP
CodeIgniter自定义控制器MY_Controller用法分析
Jan 20 PHP
php简单实现短网址(短链)还原的方法(测试可用)
May 09 PHP
注意!PHP 7中不要做的10件事
Sep 18 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
Jul 04 PHP
PHP字符串与数组处理函数用法小结
Jan 07 PHP
PHP 枚举类型的管理与设计知识点总结
Feb 13 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 mail()函数使用及配置方法
2014/01/14 PHP
CI(CodeIgniter)框架介绍
2014/06/09 PHP
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
PHP实现数组向任意位置插入,删除,替换数据操作示例
2019/04/05 PHP
验证javascript中Object和Function的关系的三段简单代码
2010/06/27 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
jquery限制输入字数,并提示剩余字数实现代码
2012/12/24 Javascript
JavaScript生成GUID的多种算法小结
2013/08/18 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
jQuery easyui刷新当前tabs的方法
2016/09/23 Javascript
vue.js单页面应用实例的简单实现
2017/04/10 Javascript
详解微信第三方小程序代开发
2017/06/23 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
2018/07/31 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
微信小程序 scroll-view 实现锚点跳转功能
2019/12/12 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
python实现udp数据报传输的方法
2014/09/26 Python
python 回调函数和回调方法的实现分析
2016/03/23 Python
Python中使用支持向量机(SVM)算法
2017/12/26 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
2018/08/05 Python
python中单例常用的几种实现方法总结
2018/10/13 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
python绘制规则网络图形实例
2019/12/09 Python
python微信公众号开发简单流程实现
2020/03/09 Python
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
越南母婴用品购物网站:Kids Plaza
2020/04/09 全球购物
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
廉政教育心得体会
2014/01/01 职场文书
请假条标准格式规范
2014/04/10 职场文书
2014年终工作总结范本
2014/12/15 职场文书
工人先进事迹材料
2014/12/26 职场文书
2016年小学生寒假家长评语
2015/10/10 职场文书