設計模式 一 簡單工廠模式

2022-05-03 04:54:07 字數 4136 閱讀 5042

使用簡單工廠模式,利用物件導向的三大特性-【封裝】-【繼承】-【多型】實現一段計算器**。下面示例為逐步優化,也可認為是乙個初級程式設計師慢慢優化自己**的過程。

一:面向過程思想的實現形式

<?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;//

此時已經利用物件導向的繼承特性,將程式的擴充套件效能體現出來,如果需要新增乙個計算平方的方法,只需要再新增乙個類,然後繼承自基類就好

// 而且並不會影響原有的計算程式, 但是此時存在乙個問題,我們需要自己去判斷例項化哪個類,那麼就需要乙個方法去幫我們排程,那此時就可以

// 使用第乙個設計模式,簡單工廠模式,到時候這個方法負責幫我們排程,我們只需將對應引數給其即可

四: 上邊使用了,封裝,繼承,**已經較為清晰了,如果產品讓我加乙個計算平方的,那我加上這乙個類就好了啊,新加的這個類中只需要寫與平方功能有關的**就行了;

但是此處是我們手動的去呼叫計算規則的,這樣是具有問題的,那就引申出第乙個設計模式,簡單工廠模式;

說白了,就是建乙個類,我們只需要按照規則將引數傳進去,這個工廠類自動判斷例項化哪個類去,我只關心結果。使用簡單工廠模式後,封裝性更好了,使用者無需關注內部怎麼實現的,

只需要按照指定規則呼叫就好了,如果想自己擴充套件,**結果也很清晰

<?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

; }}//

建立乙個工廠類,幫助我們排程程式

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如...