工廠模式是使用頻率很高的一種設計模式,在面試中也經常問到,今天我們就來學習它。解答這個問題前,我們先來了解什麼是工廠模式。
工廠模式其實也稱建立模式,是用於建立物件的一種方式。本質上就是用工廠方法來代替new例項化物件。
舉個例子:我們在編寫**的時候,在乙個a類中通過new的方式例項化了類b,那麼a類和b類之間就存在耦合,如果以後修改了b類的**和使用方式,例如需要在建構函式中傳入引數,那麼a類也就需要跟著修改了,乙個類的依賴可能影響不大,但若有多個類依賴了b類,那麼這個工作量將會相當的大,這無疑是件非常痛苦的事。這種情況下,我們需要把建立例項的工作單獨分離,與呼叫方解耦,也就是使用工廠方法建立例項的工作封裝起來。這樣我們在需要呼叫物件的時候就不需要關心那些複雜的例項化問題。
工廠模式可分為兩類:簡單工廠模式和工廠模式。
簡單工廠模式
定義乙個介面和實現類,建立乙個工廠類這些實現類進行例項的建立。
我們用球來舉例,定義乙個基本的介面ball,和乙個抽象方法play(玩),
public inte***ce ball
建立乙個籃球的類和乙個足球的類,並實現該介面,
public class basketball implements ball
}
public class football implements ball
}
然後,建立乙個工廠類,可以用於生產籃球或者足球,
public class ballfactory else if ("football".equals(type))
return null;}}
工廠類建好以後,我們就可以例項化工廠類,並呼叫produce方法來建立對應的例項物件,
public static void main(string args)
結果輸出:打籃球~~~
這就是簡單工廠模式的基本實現,用關係圖來表示就是:
當然缺點也很明顯,就是工廠類集中了所有例項的建立邏輯,如果增加業務就要多出相應的工廠方法,不僅**可能變得臃腫,也容易違反graspr的高內聚的責任分配原則
工廠模式
又稱多型性工廠模式,是對簡單工廠模式的改進。工廠模式中,乙個子類對應乙個工廠類,這些工廠類都實現了乙個工廠介面。這相當於把乙個簡單工廠類拆分成多個工廠,這樣**就不會都耦合在同乙個類裡了。
具體的產品介面和實現類還是復用上面的**,我們只需關注工廠方法的邏輯即可,
先建立乙個工廠的介面
public inte***ce ifactory
然後建立對應業務的工廠類
public class basketfactory implements ifactory
}
public class footfactory implements ifactory
}
測試**
public static void main(string args)
輸出結果是:
打籃球~~~
踢足球~~
如上所示,如果需要新增新的產品,如排球,我們就多寫乙個工廠類即可,這樣就不會把所有的業務都耦合到乙個工廠類中了,用關係圖表示如下:
最後,總結一下工廠模式的優點吧,
1、良好的封裝性,**結構清晰,呼叫者只需知道產品的類名即可,不需要知道建立物件的過程,降低**間的耦合。
2、擴充套件性優秀,如果增加乙個產品類,只需增加乙個對應的工廠類。
3、遮蔽產品類。產品類的實現如何變化,呼叫者都不需要關心,只需關心產品的介面,只要介面保持不變,系統中的上層模組就不會發生變化。
4、工廠模式是典型的解耦框架,高層模組只需要知道產品的抽象類,其他的實現類都不需要關心,符合迪公尺特法則,符合依賴倒置原則,符合黎克特制替換原則。
參考:《設計模式之禪》
設計模式 工廠模式 抽象工廠模式
建立物件時不會對客戶暴露建立邏輯,並且通過使用乙個共同的介面來指向建立的物件。sept1 建立乙個公共介面,將要對外開放的方法在這裡定義。sept2 建立實現介面的類,用即實現對外開放的類的方法 sept3 建立工廠,提供乙個get方法,這個方法提供返回實現類的物件 建立選擇 sept4 使用,建立...
設計模式 工廠設計模式
用於建立物件的介面,交給子類去實現 我們舉乙個生產nokia的例子 public abstract class nokiaphone先試定義了乙個抽象類,抽象出方法poweronphone 模擬手機開機的動作 public class nokia5200 extends nokiaphone pub...
設計模式 工廠設計模式
工廠模式分為工廠方法模式和抽象工廠模式 工廠方法模式分為 普通工廠模式,就是建立乙個工廠類,對實現了同一介面的一些類進行例項的建立。多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件。靜態工廠...