当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP设计模式之原型设计模式原理与用法分析

发布:smiling 来源: PHP粉丝网  添加日期:2021-09-12 15:14:38 浏览: 评论:0 

这篇文章主要介绍了PHP设计模式之原型设计模式,简单描述了原型设计模式的概念、原理并结合实例形式分析了php原型设计模式的定义与使用方法,需要的朋友可以参考下

本文实例讲述了PHP设计模式之原型设计模式原理与用法。分享给大家供大家参考,具体如下:

一、什么是原型设计模式

原型设计模式使用一种克隆技术来复制实例化的对象,新对象是通过复制原型实例创建的。原型设计模式的目的是通过使用克隆以减少实例化对象的开销。

在原型设计模式中,Client类是不可缺少的一部分。

PHP有一个内置的克隆方法__clone()可以在设计模式中使用,但是不能直接访问,使用clone关键字即可。克隆不会启动构造函数。

二、什么时候使用原型设计模式

如果一个项目要求你创建某个原型对象的多个实例,就可以使用原型设计模式。

三、原型设计模式实例

这里以现代企业组织为例:

  1. <?php 
  2. /** 
  3. *  原型设计模式 
  4. *        以现代企业组织为例 
  5. **/ 
  6. //部门抽象类 
  7. abstract class IAcmePrototype 
  8.   protected $id;   //员工ID号 
  9.   protected $name;  //员工名字 
  10.   protected $dept;  //员工部门 
  11.   //克隆方法 
  12.   abstract function __clone(); 
  13.   //员工部门设置方法 
  14.   abstract function setDept($orgCode); 
  15.   //员工部门获取方法 
  16.   public function getDept() 
  17.   { 
  18.     return $this->dept; 
  19.   } 
  20.   //员工ID号设置方法 
  21.   public function setId($id
  22.   { 
  23.     $this->id = $id
  24.   } 
  25.   //员工ID号获取方法 
  26.   public function getId() 
  27.   { 
  28.     return $this->id; 
  29.   } 
  30.   //员工名字设置方法 
  31.   public function setName($name
  32.   { 
  33.     $this->name = $name
  34.   } 
  35.   //员工名字获取方法 
  36.   public function getName() 
  37.   { 
  38.     return $this->name; 
  39.   } 
  40. //市场部类 
  41. class Marketing extends IAcmePrototype 
  42.   const UNIT = "Marketing";  //标识 
  43.   //市场部门类别 
  44.   private $sales = "sales"
  45.   private $promotion = "promotion"
  46.   private $strategic = "strategic planning"
  47.   //克隆函数 
  48.   function __clone() 
  49.   { 
  50.   } 
  51.   //部门设置函数 
  52.   public function setDept($orgCode
  53.   { 
  54.     switch($orgCode
  55.     { 
  56.       case 101: 
  57.           $this->dept = $this->sales; 
  58.           break
  59.       case 102: 
  60.           $this->dept = $this->promotion; 
  61.           break
  62.       case 103: 
  63.           $this->dept = $this->strategic; 
  64.           break
  65.       default
  66.           $this->dept = "Unrecognized Marketing"
  67.     } 
  68.   } 
  69. //管理部类 
  70. class Management extends IAcmePrototype 
  71.   const UNIT = "Management"
  72.   private $research = "research"
  73.   private $plan = "planning"
  74.   private $operations = "operations"
  75.   function __clone() 
  76.   { 
  77.   } 
  78.   public function setDept($orgCode
  79.   { 
  80.     switch($orgCode
  81.     { 
  82.       case 201: 
  83.           $this->dept = $this->research; 
  84.           break
  85.       case 202: 
  86.           $this->dept = $this->plan; 
  87.           break
  88.       case 203: 
  89.           $this->dept = $this->operations; 
  90.           break
  91.       default
  92.           $this->dept = "Unrecognized Marketing"
  93.     } 
  94.   } 
  95. //工厂部类 
  96. class Engineering extends IAcmePrototype 
  97.   const UNIT = "Engineering"
  98.   private $development = "programming"
  99.   private $design = "digital artwork"
  100.   private $sysAd = "system administration"
  101.   function __clone() 
  102.   { 
  103.   } 
  104.   public function setDept($orgCode
  105.   { 
  106.     switch($orgCode
  107.     { 
  108.       case 301: 
  109.           $this->dept = $this->development; 
  110.           break
  111.       case 302: 
  112.           $this->dept = $this->design; 
  113.           break
  114.       case 303: 
  115.           $this->dept = $this->sysAd; 
  116.           break
  117.       default
  118.           $this->dept = "Unrecognized Marketing"
  119.     } 
  120.   } 
  121. //客户类 
  122. class Client 
  123.   private $market;  //市场部类实例 
  124.   private $manage;  //管理部类实例 
  125.   private $engineer//工厂部类实例 
  126.   //构造函数 
  127.   public function __construct() 
  128.   { 
  129.     $this->makeConProto(); 
  130.     //市场部类实例克隆 
  131.     $Tess = clone $this->market; 
  132.     $this->setEmployee($Tess,"Tess Smith",101,"ts101-1234"); 
  133.     $this->showEmployee($Tess); 
  134.     $Jacob = clone $this->market; 
  135.     $this->setEmployee($Jacob,"Jacob Jones",102,"jj101-2234"); 
  136.     $this->showEmployee($Jacob); 
  137.     //管理部类实例克隆 
  138.     $Ricky = clone $this->manage; 
  139.     $this->setEmployee($Ricky,"Ricky Rodrigues",203,"rr203-5634"); 
  140.     $this->showEmployee($Ricky); 
  141.     //工程部类实例克隆 
  142.     $Olivia = clone $this->engineer; 
  143.     $this->setEmployee($Olivia,"Olivia perez",302,"op302-1278"); 
  144.     $this->showEmployee($Olivia); 
  145.     $John = clone $this->engineer; 
  146.     $this->setEmployee($John,"John Jackson",301,"jj301-1454"); 
  147.     $this->showEmployee($John); 
  148.   } 
  149.   //实例化部门对象 
  150.   private function makeConProto() 
  151.   { 
  152.     $this->market = new Marketing(); 
  153.     $this->manage = new Management(); 
  154.     $this->engineer = new Engineering(); 
  155.   } 
  156.   //员工信息设置方法 
  157.   private function setEmployee(IAcmePrototype $employee,$name,$dept,$id
  158.   { 
  159.     $employee->setName($name); 
  160.     $employee->setDept($dept); 
  161.     $employee->setId($id); 
  162.   } 
  163.   //员工信息显示方法 
  164.   private function showEmployee(IAcmePrototype $employee
  165.   { 
  166.     echo $employee->getName() . '<br />'
  167.     echo $employee->getDept() . '<br />'
  168.     echo $employee->getId() . '<br />'
  169.   } 
  170. $client = new Client(); 
  171. ?> 

运行结果:

  1. Tess Smith 
  2. sales 
  3. ts101-1234 
  4. Jacob Jones 
  5. promotion 
  6. jj101-2234 
  7. Ricky Rodrigues 
  8. operations 
  9. rr203-5634 
  10. Olivia perez 
  11. digital artwork 
  12. op302-1278 
  13. John Jackson 
  14. programming 
  15. jj301-1454 

 

Tags: PHP设计模式 PHP模式原理

分享到: