工廠模式的目的就是將對象的創建過程隱藏起來,從而達到很高的靈活性,工廠模式分為三類:
- 簡單工廠模式
- 工廠方法模式
- 抽象工廠模式
在沒有工廠模式的時候就是,客戶需要一輛馬車,需要客戶親自去創建一輛馬車,然后拿來用。
- 在簡單工廠模式下,客戶可以通過工廠獲得一輛馬車,需要下單后,告訴馬車的型號,然后工廠可以根據型號創建馬車。
- 在工廠方法模式下:客戶想要一輛馬車,需要指明型號創建。比如325i的bmw,和530li,根據各自325i的工廠和530li的工廠創建,每個工廠創建一個系列。即具體的工廠只能創建出一個具體的產品。
- 在抽象工廠模式下:客戶想要一輛帶空調的寶馬車,于是開始創建帶空調的寶馬車,不需要自己創建安裝。
不適用工廠模式
如果不使用工廠,用戶將自己創建寶馬車,具體UML圖和代碼如下:
public class BMW320 {public BMW320(){System.out.println("制造-->BMW320");}
}public class BMW523 {public BMW523(){System.out.println("制造-->BMW523");}
}public class Customer {public static void main(String[] args) {BMW320 bmw320 = new BMW320();BMW523 bmw523 = new BMW523();}
}
用戶需要知道怎么創建一款車,這樣子客戶和車就緊密耦合在一起了,為了降低耦合,就出現了簡單工廠模式,把創建寶馬的操作細節都放到了工廠里,而客戶直接使用工廠的創建方法,傳入想要的寶馬車型號就行了,而不必去知道創建的細節。
簡單工廠模式:
核心是:創建一個對象的接口,然后根據接口創建具體的實現,將創建與本身的業務邏輯分開,降低耦合度。
1.UML圖:
-
工廠類角色: 該模式的核心,用來創建產品,含有一定的商業邏輯和判斷邏輯
-
抽象產品角色:它一般是具體產品繼承的父類或者實現的接口。
-
具體產品角色:工廠類所創建的對象就是此角色的實例。在java中由一個具體類實現。
2.代碼實現:
產品類
abstract class BMW {public BMW(){}
}public class BMW320 extends BMW {public BMW320() {System.out.println("制造-->BMW320");}
}
public class BMW523 extends BMW{public BMW523(){System.out.println("制造-->BMW523");}
}
工廠類
public class Factory {public BMW createBMW(int type) {switch (type) {case 320:return new BMW320();case 523:return new BMW523();default:break;}return null;}
}
用戶類
public class Customer {public static void main(String[] args) {Factory factory = new Factory();BMW bmw320 = factory.createBMW(320);BMW bmw523 = factory.createBMW(523);}
}
3.優點
?????????簡單工廠模式提供了專門的工廠類用于創建對象,實現類對象的創建和使用的職責分離,客戶端不需要知道所創建的具體產品類的類名以及創建過程,只需要具體產品所對應的參數即可。通過引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。
4.缺點
????????在于不符合“開閉原則”,每次添加新產品就需要修改工廠類。在產品類型較多時,有可能造成工廠邏輯過于復雜,不利于系統的擴展維護,并且工廠類集中了所有產品創建邏輯,一旦不能正常工作,整個系統都要受到影響。
為了解決簡單工廠模式的問題,出現了工廠方法模式。
工廠模式
????????工廠方法模式將工廠抽象化,并定義一個創建對象的接口。每增加新產品,只需增加該產品以及對應的具體實現工廠類,由具體工廠類決定要實例化的產品是哪個,將對象的創建與實例化延遲到子類,這樣工廠的設計就符合“開閉原則”了,擴展時不必去修改原來的代碼。在使用時,用于只需知道產品對應的具體工廠,不需要關注具體的創建過程,甚至不需要知道具體產品類的類名,當我們選擇哪個具體工廠時,就已經決定了實際創建的產品是哪個了。
????????但缺點在于,每增加一個產品都需要增加一個具體產品類和實現工廠類,使得系統中類的個數成倍增加,在一定程度上增加了系統的復雜度,同時也增加了系統具體類的依賴。
1.UML圖
抽象工廠 AbstractFactory: 工廠方法模式的核心,是具體工廠角色必須實現的接口或者必須繼承的父類,在 Java 中它由抽象類或者接口來實現。具體工廠 Factory:被應用程序調用以創建具體產品的對象,含有和具體業務邏輯有關的代碼抽象產品 AbstractProduct:是具體產品繼承的父類或實現的接口,在 Java 中一般有抽象類或者接口來實現。 具體產品 Product:具體工廠角色所創建的對象就是此角色的實例。
代碼實現
產品類
abstract class BMW {public BMW(){}
}
public class BMW320 extends BMW {public BMW320() {System.out.println("制造-->BMW320");}
}
public class BMW523 extends BMW{public BMW523(){System.out.println("制造-->BMW523");}
}
工廠類;
interface FactoryBMW {BMW createBMW();
}public class FactoryBMW320 implements FactoryBMW{@Overridepublic BMW320 createBMW() {return new BMW320();}}
public class FactoryBMW523 implements FactoryBMW {@Overridepublic BMW523 createBMW() {return new BMW523();}
}
用戶類
public class Customer {public static void main(String[] args) {FactoryBMW320 factoryBMW320 = new FactoryBMW320();BMW320 bmw320 = factoryBMW320.createBMW();FactoryBMW523 factoryBMW523 = new FactoryBMW523();BMW523 bmw523 = factoryBMW523.createBMW();}
}