使用簡單工廠模式,利用物件導向的三大特性-【封裝】-【繼承】-【多型】實現一段計算器**。下面示例為逐步優化,也可認為是乙個初級程式設計師慢慢優化自己**的過程。
一:面向過程思想的實現形式
<?php//按最初的版本寫
class
jisuanqi
if (!$me
)
switch ($me
)
return
$num1 / $num2
;
default:
return 'haha';}}
}$j = new
jisuanqi();
$res = $j->jisuan(1, 2, '/');
echo
$res;//
此種寫法的缺點:不易擴充套件,沒有按業務進行封裝,沒辦法復用
// 改進一步,將兩個業務邏輯進行封裝,可復用的內容進行提煉, 例如計算器分為輸入端和計算端
二:使用封裝,按照功能模組進行劃分,這樣較前一種書寫形式已經比較好修改**,尋找功能塊了,但是還是很渣
<?php//進行方法的封裝
class
operation
$res = $num1 / $num2
;
break
;
default:
return 'error';
}return
$res
; }
public
function main($num1, $num2, $operation
)
if (!$operation
)
$res = $this->getresult($num1, $num2, $operation
);
echo
$res
; }
}$a = new
operation();
$a->main(1, 2, '/');
//這僅僅是使用到了物件導向的三個特性,封裝,繼承,多型中的乙個,封裝,但是此時耦合度很高,好的程式要做到松耦合,就是修改乙個地方,
// 並不會影響到現有的功能,如果此處想增加乙個開方根運算,緊耦合中必須得更改源**,松耦合中,新增新的功能不會影響到舊的,所以使用繼承的特性
三:上述方法已經使用了封裝,但是還是不利於擴充套件;
如果產品經理說我需要加計算平法的功能進去,那只能是修改switch的功能塊,此處因為邏輯簡單,可能認為修改會簡單些;
但是如果每個計算規則中都需要記錄使用者的輸入資訊,存入資料庫,存入redis, 然後用一次計算器給加個積分,積分到了哪個級別自動發放禮品等等複雜邏輯進去。
那我心裡就會罵這產品瞎改什麼需求,當然產品經常改需求很不好,但也有咱們自己的原因,**寫成一大坨,耦合性這麼高,找個大牛出來都覺得看的頭疼,別說咱們這種渣渣了;
所以此處我們可以想辦法把各個運算規則再拆出來,再封裝啊。
如果使用面向過程的思想,可以將各個規則分別封裝成乙個方法,然後用的時候呼叫就可以了,當然這種也能滿足上面描述的情況;
但是如果這些計算規則都具有一定的共性,那麼此處使用物件導向的繼承更優一些
<?php//使用物件導向的繼承特性,達到松耦合
// 建立計算器類
class
operation
public
function __get($name
)
public
function
getresult()
}//建立加法類
class operationadd extends
operation}//
建立減法類
class operationsub extends
operation}//
建立乘法類
class operationmul extends
operation}//
建立除法類
class operationdiv extends
operation
$res = 0;
$res = $this->num1 - $this->num2;
return
$res
; }
}$add = new
operationadd();
$add->num1 = 1;
$add->num2 = 2;
$res = $add->getresult();
echo
$res;//
此時已經利用物件導向的繼承特性,將程式的擴充套件效能體現出來,如果需要新增乙個計算平方的方法,只需要再新增乙個類,然後繼承自基類就好
// 而且並不會影響原有的計算程式, 但是此時存在乙個問題,我們需要自己去判斷例項化哪個類,那麼就需要乙個方法去幫我們排程,那此時就可以
// 使用第乙個設計模式,簡單工廠模式,到時候這個方法負責幫我們排程,我們只需將對應引數給其即可
四: 上邊使用了,封裝,繼承,**已經較為清晰了,如果產品讓我加乙個計算平方的,那我加上這乙個類就好了啊,新加的這個類中只需要寫與平方功能有關的**就行了;
但是此處是我們手動的去呼叫計算規則的,這樣是具有問題的,那就引申出第乙個設計模式,簡單工廠模式;
說白了,就是建乙個類,我們只需要按照規則將引數傳進去,這個工廠類自動判斷例項化哪個類去,我只關心結果。使用簡單工廠模式後,封裝性更好了,使用者無需關注內部怎麼實現的,
只需要按照指定規則呼叫就好了,如果想自己擴充套件,**結果也很清晰
<?phpclass
operation
public
function __get($name
)
public
function
getresult()
}//建立加法類
class operationadd extends
operation}//
建立減法類
class operationsub extends
operation}//
建立乘法類
class operationmul extends
operation}//
建立除法類
class operationdiv extends
operation
$res = 0;
$res = $this->num1 - $this->num2;
return
$res
; }}//
建立乙個工廠類,幫助我們排程程式
class
operationfactory
if (!$operation
)
//呼叫工廠,工廠生成了模型
$opera = $this->createoperation($operation
);
$opera->num1 = $num1
;
$opera->num2 = $num2
;
$res = $opera->getresult();
return
$res
; }
public
function createoperation($operation
)
return
$opera
; }
}$opera = new
operationfactory();
$res = $opera->getoperares(1, 3, '+');
echo
$res;//
此處主要體現簡單工廠模式的思想,此類還有很多地方需要完善,當然這只是簡單的加減乘除,不用工廠模式更加簡單,但是計算規則複雜後就體現出封裝
// 的優越性,產品經理需求變動頻繁,經常加功能,該功能就體現出了繼承導致松耦合的優越性
工廠設計模式一 簡單工廠模式
工廠設計模式實現了建立者和呼叫者的分離。類別 1.簡單工廠模式 2.工廠方法模式 3.抽象工廠模式 遵循的設計原則 1.ocp 開閉原則,open closed principle 乙個軟體的實體應當那個對擴充套件開放,對修改關閉 2.dip 依賴倒置原則,dependence inversion ...
工廠設計模式(一) 簡單工廠模式
工廠設計模式可分為 簡單工廠模式 工廠方法模式 抽象工廠模式 第一篇我們來聊聊 理解 假設某些例項具有相同的方法,可以根據引數的不同返回不同的例項,被建立的例項通常都具有共同的父類,那麼可以考慮使用簡單設計模式來實現。例如可以實用簡單工廠模式設計乙個可以建立不同幾何形狀 如圓形 方形和三角形等 的繪...
設計模式 一 工廠模式 簡單工廠
以前總覺得設計模式純屬扯淡,浪費精力,10 能搞定的事情非要寫那麼多的介面或者實現類.為什麼要用設計模式,開發有乙個重要的原則 對修改關閉,對擴充套件開放.因為如果把 全部都雜糅到乙個類中,第一 復用性太差,擴充套件性不強.第二,修改起來一改巨改,改動即意味著要增加測試人員工作量,且引入修改bug如...