PHP設(shè)計(jì)模式之原型設(shè)計(jì)模式原理與用法分析
本文實(shí)例講述了PHP設(shè)計(jì)模式之原型設(shè)計(jì)模式原理與用法。分享給大家供大家參考,具體如下:
一、什么是原型設(shè)計(jì)模式
原型設(shè)計(jì)模式使用一種克隆技術(shù)來(lái)復(fù)制實(shí)例化的對(duì)象,新對(duì)象是通過(guò)復(fù)制原型實(shí)例創(chuàng)建的。原型設(shè)計(jì)模式的目的是通過(guò)使用克隆以減少
實(shí)例化對(duì)象的開(kāi)銷。
在原型設(shè)計(jì)模式中,Client類是不可缺少的一部分。
PHP有一個(gè)內(nèi)置的克隆方法__clone()
可以在設(shè)計(jì)模式中使用,但是不能直接訪問(wèn),使用clone關(guān)鍵字即可。克隆不會(huì)啟動(dòng)構(gòu)造函數(shù)。
二、什么時(shí)候使用原型設(shè)計(jì)模式
如果一個(gè)項(xiàng)目要求你創(chuàng)建某個(gè)原型對(duì)象的多個(gè)實(shí)例,就可以使用原型設(shè)計(jì)模式。
三、原型設(shè)計(jì)模式實(shí)例
這里以現(xiàn)代企業(yè)組織為例:
<?php /** * 原型設(shè)計(jì)模式 * 以現(xiàn)代企業(yè)組織為例 **/ //部門抽象類 abstract class IAcmePrototype { protected $id; //員工ID號(hào) protected $name; //員工名字 protected $dept; //員工部門 //克隆方法 abstract function __clone(); //員工部門設(shè)置方法 abstract function setDept($orgCode); //員工部門獲取方法 public function getDept() { return $this->dept; } //員工ID號(hào)設(shè)置方法 public function setId($id) { $this->id = $id; } //員工ID號(hào)獲取方法 public function getId() { return $this->id; } //員工名字設(shè)置方法 public function setName($name) { $this->name = $name; } //員工名字獲取方法 public function getName() { return $this->name; } } //市場(chǎng)部類 class Marketing extends IAcmePrototype { const UNIT = "Marketing"; //標(biāo)識(shí) //市場(chǎng)部門類別 private $sales = "sales"; private $promotion = "promotion"; private $strategic = "strategic planning"; //克隆函數(shù) function __clone() { } //部門設(shè)置函數(shù) 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; //市場(chǎng)部類實(shí)例 private $manage; //管理部類實(shí)例 private $engineer; //工廠部類實(shí)例 //構(gòu)造函數(shù) public function __construct() { $this->makeConProto(); //市場(chǎng)部類實(shí)例克隆 $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); //管理部類實(shí)例克隆 $Ricky = clone $this->manage; $this->setEmployee($Ricky,"Ricky Rodrigues",203,"rr203-5634"); $this->showEmployee($Ricky); //工程部類實(shí)例克隆 $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); } //實(shí)例化部門對(duì)象 private function makeConProto() { $this->market = new Marketing(); $this->manage = new Management(); $this->engineer = new Engineering(); } //員工信息設(shè)置方法 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(); ?>
運(yùn)行結(jié)果:
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
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
- php設(shè)計(jì)模式 Delegation(委托模式)
- php設(shè)計(jì)模式之委托模式
- PHP設(shè)計(jì)模式之建造者模式定義與用法簡(jiǎn)單示例
- PHP設(shè)計(jì)模式之裝飾器模式定義與用法簡(jiǎn)單示例
- PHP耦合設(shè)計(jì)模式實(shí)例分析
- PHP設(shè)計(jì)模式之觀察者模式定義與用法示例
- PHP設(shè)計(jì)模式之適配器模式原理與用法分析
- PHP設(shè)計(jì)模式之單例模式原理與實(shí)現(xiàn)方法分析
- PHP常用的三種設(shè)計(jì)模式匯總
- PHP設(shè)計(jì)模式之委托模式定義與用法簡(jiǎn)單示例
相關(guān)文章
php中g(shù)et_object_vars()方法用法實(shí)例
這篇文章主要介紹了php中g(shù)et_object_vars()方法用法,實(shí)例分析了get_object_vars()方法獲取對(duì)象中屬性的使用技巧,需要的朋友可以參考下2015-02-02PHP+jQuery實(shí)現(xiàn)滾屏無(wú)刷新動(dòng)態(tài)加載數(shù)據(jù)功能詳解
這篇文章主要介紹了PHP+jQuery實(shí)現(xiàn)滾屏無(wú)刷新動(dòng)態(tài)加載數(shù)據(jù)功能,涉及php動(dòng)態(tài)讀取數(shù)據(jù)庫(kù)及加載數(shù)據(jù)實(shí)現(xiàn)滾屏無(wú)刷新效果的具體操作技巧,需要的朋友可以參考下2017-05-05php中json_decode()和json_encode()的使用方法
json_decode對(duì)JSON格式的字符串進(jìn)行編碼而json_encode對(duì)變量進(jìn)行 JSON 編碼,需要的朋友可以參考下2012-06-06PHP中用header圖片地址 簡(jiǎn)單隱藏圖片源地址
用header實(shí)現(xiàn)圖片地址的隱藏2008-04-04php獲得文件大小和文件創(chuàng)建時(shí)間的方法
這篇文章主要介紹了php獲得文件大小和文件創(chuàng)建時(shí)間的方法,涉及php中filesize及fileatime函數(shù)的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03關(guān)于PHP session 存儲(chǔ)方式的詳細(xì)介紹
本篇文章是對(duì)PHP中的session存儲(chǔ)方式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06php array_walk array_map array_filter區(qū)別案例詳解
這篇文章主要介紹了php array_walk array_map array_filter區(qū)別案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09php實(shí)現(xiàn)事件監(jiān)聽(tīng)與觸發(fā)的方法
這篇文章主要介紹了php實(shí)現(xiàn)事件監(jiān)聽(tīng)與觸發(fā)的方法,可實(shí)現(xiàn)時(shí)間的綁定、觸發(fā)與注銷等功能,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-11-11