該文章屬於《編程中的那些經典套路——設計模式彙總》系列,而且如下內容基於語言PHPphp
面向對象五大原則中有一點很是重要的原則:單一職責原則。編程
簡單工廠模式就是遵循了這一原則,它讓不一樣職責的類各司其職。segmentfault
簡單工廠模式是面向對象多態性的一個應用,它的好處在於:設計模式
代碼具備必定的拓展性函數
遵循了單一職責原則設計
屬於面向接口編程code
簡單工廠模式提供了一個對外的類 Client和實際工做的類,外界只須要傳遞特定的參數就能夠調用不一樣的實際功能類,而不須要直接面對實際類與函數,拓展性大大加強。對象
一言不合上代碼。接口
簡單工廠模式.phpget
<?php //設定銀行工做接口 interface Bankwork{ public function work(); } //存款職員 class Depositer implements Bankwork{ public function work(){ return '開始存款'; } } //銷售職員 class Marketer implements bankwork{ public function work(){ return '開始銷售'; } } //接待職員 class Receiver implements Bankwork{ public function work(){ return '開始接待'; } } //客戶端調用接口類 class Client { public function working($type){ switch ($type) { case '存款職員': $man = new Depositer; break; case '銷售': $man = new Marketer; break; case '接待': $man = new Receiver; break; default: echo '傳輸參數有誤,不屬於任何一個職位'; break; } return $man->work(); } } $bankstaff = new Client(); print_r($bankstaff->working('接待')); // output :開始接待 ?>
簡單工廠模式能夠經過傳遞對應的參數從而調用指定的類方法,後期須要增長職位的話,能夠直接新增一個類而後寫一個switch ($type) {case’condition’: }便可。
重點來了,簡單工廠模式的不足:
可是簡單工廠模式有一個不足,雖然它遵循了單一職責原則,但它違反了另外一條一樣很重要的原則:開放封閉原則。
若是新增一個財務職位,那麼咱們還要修改 Client類,增長一個switch ($type) {case’condition’: }判斷,這無疑是十分災難的,由於寫好的代碼咱們最好不要再去碰它,由於極可能形成未知的緣由,你說是不?
由此衍生出更加規範,拓展性更強,遵循了開放封閉原則的的工廠模式(沒有簡單):