設計模式----工廠設計模式
工廠設計模式概念
- 什麼是工廠設計模式
工廠設計模式,理解為用來生產物件的,Java是物件導向程式語言,Java語言中,物件都是需要建立的,物件都是透過關鍵字new例項化,試想,如果在程式中需要例項化10個物件,遇到需求變更,例項化的物件需要改變,那例項化物件的10處地方都需要修改;這個時候可以設計為工廠模式,如果獲取物件不是直接new例項化的,而是透過工廠獲取物件,那麼,物件有修改的時候,只需要透過修改工廠中的物件,就可以將所有的物件修改,所有得出工廠模式的最大優點是:解耦
- 工廠設計模式分類
- 簡單工廠(不屬於23設計及模式)
- 工廠方法
- 抽象工廠
一、簡單工廠
- 概述
簡單工廠不屬於23種設計模式,更像是對程式碼結構的一種改造,將例項化物件的程式碼進行抽取,抽取成工廠的類,在程式程式碼種需要用到該物件的時候,從工廠種獲取即可,如果對該例項有修改,也只需要修改簡單工廠中例項化物件即可。
- 舉例
比如現在有一個介面Phone,定義生產手機;這個介面有兩個實現類,分別是XiaoMi和HuaWei;如果需求要例項化小米或者華為手機,直接用類進行例項化物件即可;假設現在程式中有100處例項化了小米手機,還有100處例項化了華為手機,維護的時候需要依次去修改;這個時候可以考慮簡單工廠的方式,將例項化手機物件的操作交給工廠,只需要告訴工廠需求,就能夠得到相應的物件。
-
圖示
-
程式碼事例
1)定義Phone介面
public interface Phone {
//建立手機的方法
public String getPhone();
}
2)定義華為手機類,實現Phone介面
public class HuaWei implements Phone{
//重寫建立電話的方法
@Override
public String getPhone() {
return "建立一個華為手機物件";
}
}
3)定義小米手機類,實現Phone介面
public class XiaoMi implements Phone{
//重寫建立手機的方法
@Override
public String getPhone() {
return "建立一個小米手機物件";
}
}
- 上面一個Phone介面和兩個實現類,關係類圖如下:
- 編寫一個簡單工廠類,提供建立物件的方法
//定義簡單工廠類
public class SimpleFactory {
//建立手機的方法
public static Phone createPhone(String type){
if("小米".equals(type)){
return new XiaoMi();
}else if("華為".equals(type)){
return new HuaWei();
}else{
throw new RuntimeException("該工廠不可識別型別-->"+type);
}
}
//測試一下工廠類中建立手機的方法
public static void main(String[] args) {
Phone p1 = SimpleFactory.createPhone("小米");
System.out.println(p1.getPhone());
Phone p2 = SimpleFactory.createPhone("華為");
System.out.println(p2.getPhone());
}
}
- 總結:在簡單工廠中,建立物件的方法中建立物件數量較少,需要建立什麼物件只需要傳入邏輯引數即可,比如上述程式碼中的String type一樣。
二、工廠方法模式
- 概述
工廠方法模式指定義一個建立物件的介面,但讓是實現了這個介面的類來決定例項化那個類,工廠方法讓類的例項化轉換到子類中進行;簡單理解:定義一個工廠介面,將該介面的實現類都設計成一個工廠,在工廠的實現類中建立物件,這樣就減少了簡單工廠裡面複雜的邏輯判斷,使用者需要哪個物件,只需要獲取對應的工廠,再由工廠獲取物件即可。
- 圖示
- 事例程式碼
簡單工廠案例中用到的Phone介面、HuaWei實現類和XiaoMi實現類在這個案例中繼續使用,下面只寫從工廠介面開始
1)建立工廠介面,該介面中只定義,不做實現
public interface PhoneFactory {
//定義建立電話的方法
public Phone createPhone();
}
2)定義建立華為電話物件的工廠
public class HuaWeiFactory implements PhoneFactory{
//重寫建立電話的方法
@Override
public Phone createPhone() {
return new HuaWei();
}
}
3)定義建立小米手機物件的工廠
public class XiaoMiFactory implements PhoneFactory{
//重寫建立電話的方法
@Override
public Phone createPhone() {
return new XiaoMi();
}
}
4)測試上述方法
public class Test {
public static void main(String[] args) {
//建立華為手機
HuaWeiFactory huaWeiFactory = new HuaWeiFactory();
Phone huaweiPhone = huaWeiFactory.createPhone();
System.out.println(huaweiPhone.getPhone());
//建立小米手機
XiaoMiFactory xiaoMiFactory = new XiaoMiFactory();
Phone xiaomiPhone = xiaoMiFactory.createPhone();
System.out.println(xiaomiPhone.getPhone());
}
}
- 上面工廠介面和工廠介面實現類關係圖
三、抽象工廠
- 概念
抽象工廠是指提供一個建立一系列相關或相互依賴物件的介面,無需指定他們具體的類;和方法工廠做比較,方法工廠要求先有對應類的物件,如果新增類,那麼就需要新增工廠類,會導致類爆炸;在抽象工廠中,呼叫工廠的時候,可能工廠都還沒有,需要的時候再去拿到具體的工廠或者補充,可以提升系統的擴充套件性
- 圖示
- 事例程式碼
這裡仍然引用簡單工廠模式裡面的Phone程式碼,並且按照同樣的模式,新增兩個Computer介面及實現類和Ipad介面及實現類,比較簡單.
1)Phone介面及實現類
//手機介面
public interface Phone {
//定義獲取手機的方法
public String getPhone();
}
//華為手機實現類
public class HuaWeiPhone implements Phone{
@Override
public String getPhone() {
return "建立華為手機";
}
}
//小米手機實現類
public class XiaoMiPhone implements Phone{
@Override
public String getPhone() {
return "建立小米手機";
}
}
2)Computer介面及實現類
//定義電腦介面
public interface Computer {
//定義獲取電腦的方法
public String getComputer();
}
//華為電腦
public class HuaWeiComputer implements Computer{
@Override
public String getComputer() {
return "建立華為電腦";
}
}
//建立小米電腦
public class XiaoMiComputer implements Computer{
@Override
public String getComputer() {
return "建立小米電腦";
}
}
3)Ipad介面及實現類
//平板的介面
public interface Ipad {
public String getIpad();
}
//華為平板電腦
public class HuaWeiIpad implements Ipad{
@Override
public String getIpad() {
return "建立華為平板電腦";
}
}
//小米平板電腦
public class XiaoMiIpad implements Ipad{
@Override
public String getIpad() {
return "建立小米平板電腦";
}
}
4)編寫頂層工廠介面
public interface AbstractFactory {
//定義建立手機的方法
public Phone createPhone();
//定義建立電腦的方法
public Computer createComputer();
//定義建立平板電腦的方法
public Ipad createIpad();
}
5)定義華為工廠,實現頂層工廠介面
public class HuaWeiFactory implements AbstractFactory{
@Override
public Phone createPhone() {
return new HuaWeiPhone();
}
@Override
public Computer createComputer() {
return new HuaWeiComputer();
}
@Override
public Ipad createIpad() {
return new HuaWeiIpad();
}
}
6)定義小米工廠,實現頂層工廠介面
public class XiaoMi implements AbstractFactory{
@Override
public Phone createPhone() {
return new XiaoMiPhone();
}
@Override
public Computer createComputer() {
return new XiaoMiComputer();
}
@Override
public Ipad createIpad() {
return new XiaoMiIpad();
}
}
7)測試類
public class Test {
public static void main(String[] args) {
//建立華為物件
HuaWeiFactory huaWeiFactory = new HuaWeiFactory();
Phone huaweiPhone = huaWeiFactory.createPhone();
Computer huaweiComputer = huaWeiFactory.createComputer();
Ipad huaweiIpad = huaWeiFactory.createIpad();
//列印
System.out.println(huaweiPhone.getPhone()+":"+
huaweiComputer.getComputer()+":"+
huaweiIpad.getIpad());
//建立小米物件
XiaoMiFactory xiaoMiFactory = new XiaoMiFactory();
Phone xiaomiPhone = xiaoMiFactory.createPhone();
Computer xiaomiComputer = xiaoMiFactory.createComputer();
Ipad xiaomiIpad = xiaoMiFactory.createIpad();
//列印
System.out.println(xiaomiPhone.getPhone()+":"+
xiaomiComputer.getComputer()+":"+
xiaomiIpad.getIpad());
}
}
- 工廠介面及對應實現類的關係圖
以上就是工廠設計模式的內容!!!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/756/viewspace-2797199/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 設計模式-工廠設計模式設計模式
- 【設計模式】工廠模式設計模式
- 設計模式 —— 工廠模式設計模式
- 設計模式-工廠模式設計模式
- 設計模式(工廠模式)設計模式
- 設計模式——工廠模式設計模式
- 設計模式----工廠模式設計模式
- 設計模式-工廠模式二(工廠方法模式)設計模式
- 一.設計模式之工廠設計模式設計模式
- Java設計模式(工廠方法設計模式)Java設計模式
- 工廠設計模式設計模式
- 設計模式——抽象工廠模式設計模式抽象
- 設計模式 —— 抽象工廠模式設計模式抽象
- PHP設計模式-- 工廠模式PHP設計模式
- 設計模式-抽象工廠模式設計模式抽象
- Java設計模式(工廠模式)Java設計模式
- Java設計模式--工廠模式Java設計模式
- Java 設計模式(工廠模式)Java設計模式
- java設計模式-工廠模式Java設計模式
- 設計模式 - 工廠方法模式設計模式
- 設計模式之工廠模式設計模式
- java設計模式 – 工廠模式Java設計模式
- 設計模式 #2 (工廠模式)設計模式
- 設計模式之【工廠模式】設計模式
- 設計模式-工廠方法模式設計模式
- 設計模式~~~工廠方法模式設計模式
- PHP設計模式_工廠模式PHP設計模式
- 設計模式——工廠方法模式設計模式
- 設計模式(四)工廠模式設計模式
- Java設計模式:工廠模式Java設計模式
- 設計模式(三)——工廠模式設計模式
- 【設計模式】工廠方法模式設計模式
- 設計模式之工廠方法模式|抽象工廠模式設計模式抽象
- 設計模式-簡單工廠、工廠方法模式、抽象工廠模式設計模式抽象
- 設計模式學習(二)工廠模式——抽象工廠模式設計模式抽象
- Javascript 設計模式之工廠模式JavaScript設計模式
- 設計模式之工廠模式(三)設計模式
- 設計模式之工廠模式(二)設計模式