激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - PHP中“簡單工廠模式”實例代碼講解

PHP中“簡單工廠模式”實例代碼講解

2020-01-08 16:58PHP教程網 PHP教程

PHP中簡單工廠模式實例代碼,學習php類的朋友可以參考下

簡單工廠模式: 
①抽象基類:類中定義抽象一些方法,用以在子類中實現 
②繼承自抽象基類的子類:實現基類中的抽象方法 
③工廠類:用以實例化對象 

看完文章再回頭來看下這張圖,效果會比較好 

PHP中“簡單工廠模式”實例代碼講解

采用封裝方式 

復制代碼代碼如下:


<?php 
class Calc{ 
/** 
* 計算結果 

* @param int|float $num1 
* @param int|float $num2 
* @param string $operator 
* @return int|float 
*/ 
public function calculate($num1,$num2,$operator){ 
try { 
$result=0; 
switch ($operator){ 
case '+': 
$result= $num1+$num2; 
break; 
case '-': 
$result= $num1-$num2; 
break; 
case '*': 
$result= $num1*$num2; 
break; 
case '/': 
if ($num2==0) { 
throw new Exception("除數不能為0"); 

$result= $num1/$num2; 
break; 
return $result; 

}catch (Exception $e){ 
echo "您輸入有誤:".$e->getMessage(); 



$test=new Calc(); 
// echo $test->calculate(2,3,'+');//打印:5 
echo $test->calculate(5,0,'/');//打印:您輸入有誤:除數不能為0 
?> 


優點:以上代碼使用了面向對象的封裝特性,只要有了include這個類,其他頁面就可以隨便使用了 
缺點:無法靈活的擴展和維護 
比如:想要增加一個“求余”運算,需要在switch語句塊中添加一個分支語句,代碼需要做如下改動 
添加分支語句 

復制代碼代碼如下:


<?php 
class Calc{ 
public function calculate($num1,$num2,$operator){ 
try { 
$result=0; 
switch ($operator){ 
//......省略...... 
case '%': 
$result= $num1%$num2; 
break; 
//......省略...... 

}catch (Exception $e){ 
echo "您輸入有誤:".$e->getMessage(); 



?> 


代碼分析:用以上方法實現給計算器添加新的功能運算有以下幾個缺點 
①需要改動原有的代碼塊,可能會在為了“添加新功能”而改動原有代碼的時候,不小心將原有的代碼改錯了 
②如果要添加的功能很多,比如:‘乘方',‘開方',‘對數',‘三角函數',‘統計',或者添加一些程序員專用的計算功能,比如:And, Or, Not, Xor,這樣就需要在switch語句中添加N個分支語句。想象下,一個計算功能的函數如果有二三十個case分支語句,代碼將超過一屏,不僅令代碼的可讀性大大降低,關鍵是,為了添加小功能,還得讓其余不相關都參與解釋,這令程序的執行效率大大降低 
解決途徑:采用OOP的繼承和多態思想 
簡單工廠模式的初步實現 

復制代碼代碼如下:


<?php 
/** 
* 操作類 
* 因為包含有抽象方法,所以類必須聲明為抽象類 
*/ 
abstract class Operation{ 
//抽象方法不能包含函數體 
abstract public function getValue($num1,$num2);//強烈要求子類必須實現該功能函數 

/** 
* 加法類 
*/ 
class OperationAdd extends Operation { 
public function getValue($num1,$num2){ 
return $num1+$num2; 


/** 
* 減法類 
*/ 
class OperationSub extends Operation { 
public function getValue($num1,$num2){ 
return $num1-$num2; 


/** 
* 乘法類 
*/ 
class OperationMul extends Operation { 
public function getValue($num1,$num2){ 
return $num1*$num2; 


/** 
* 除法類 
*/ 
class OperationDiv extends Operation { 
public function getValue($num1,$num2){ 
try { 
if ($num2==0){ 
throw new Exception("除數不能為0"); 
}else { 
return $num1/$num2; 

}catch (Exception $e){ 
echo "錯誤信息:".$e->getMessage(); 



?> 


這里采用了面向對象的繼承特性,首先聲明一個虛擬基類,在基類中指定子類務必實現的方法(getValue()) 
分析:通過采用面向對象的繼承特性,我們可以很容易就能對原有程序進行擴展,比如:‘乘方',‘開方',‘對數',‘三角函數',‘統計'等等。 

復制代碼代碼如下:


<?php 
/** 
* 求余類(remainder) 

*/ 
class OperationRem extends Operation { 
public function getValue($num1,$num2){ 
return $num1%$num12; 


?> 


我們只需要另外寫一個類(該類繼承虛擬基類),在類中完成相應的功能(比如:求乘方的運算),而且大大的降低了耦合度,方便日后的維護及擴展 
現在還有一個問題未解決,就是如何讓程序根據用戶輸入的操作符實例化相應的對象呢? 
解決辦法:使用一個單獨的類來實現實例化的過程,這個類就是工廠 
代碼如下: 

復制代碼代碼如下:


<?php 
/** 
* 工程類,主要用來創建對象 
* 功能:根據輸入的運算符號,工廠就能實例化出合適的對象 

*/ 
class Factory{ 
public static function createObj($operate){ 
switch ($operate){ 
case '+': 
return new OperationAdd(); 
break; 
case '-': 
return new OperationSub(); 
break; 
case '*': 
return new OperationSub(); 
break; 
case '/': 
return new OperationDiv(); 
break; 



$test=Factory::createObj('/'); 
$result=$test->getValue(23,0); 
echo $result; 
?> 


原創文章,轉載請注明出處:http://www.cnblogs.com/hongfei/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 污视频在线免费播放 | 久草在线网址 | 92自拍视频| 欧产日产国产精品乱噜噜 | 欧美激情 在线播放 | 日本成人在线播放 | 中文字幕在线视频日本 | 天天躁狠狠躁夜躁2020挡不住 | china对白普通话xxxx | 免费日韩片 | 91九色视频在线观看 | 最新黄色电影网站 | 国产精品久久av | 日韩中文一区 | 视频h在线 | 鲁丝片一区二区三区免费入口 | 精品国产一区二区三区四区在线 | 国产激爽大片在线播放 | 男男羞羞视频网站国产 | 人人玩人人爽 | 99久久久国产精品免费观看 | 欧美成人精品一区 | 亚洲日本欧美 | 成人黄色在线电影 | 国产欧美日韩在线不卡第一页 | 一级免费 | 一本色道久久综合亚洲精品图片 | 免费日本一区二区 | 亚洲成人中文字幕在线 | chinesehdxxxx实拍| 成人444kkkk在线观看 | 九九热精品在线 | 91真视频 | 成人久久久精品国产乱码一区二区 | 黄色大片网站在线观看 | 免费毛片小视频 | 国产成人综合在线观看 | 免费在线观看一级片 | 国产午夜亚洲精品理论片大丰影院 | 狠狠操电影 | 亚洲国产精品一区二区久久 |