php教程

超轻量级php框架startmvc

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

更新时间:2020-03-27 07:08:05 作者:startmvc
本文实例讲述了PHP设计模式之原型设计模式原理与用法。分享给大家供大家参考,具体如下

本文实例讲述了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 设计模式 原型设计模式