工廠模式
一、工廠模式主要是爲創建對象提供過渡接口,以便將創建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。
1.首先我們應該簡單明確Java代碼規範的開閉原則:
對擴展開放;對修改封閉
在明確了java的規範之後,來看所謂的工廠模式。
2.工廠模式在很多地方區分不同,有些地方把它嚴格區分爲三類,簡單工廠模式,工廠方法模式,(抽象工廠模式)。大部分時候我們將他們區分爲兩類,即工廠方法模式,抽象工廠模式。原因看完即懂
1)簡單工廠模式(Simple Factory):不利於產生系列產品、違背了開閉原則、該模式下的工廠類我們一般稱它爲上帝類或者全能類;
2)工廠方法模式(Factory Method):又稱爲多形性工廠、符合開閉原則、但不適合產品中類非常多的情況下,因爲會出現大量與之對應的工廠對象。
3)抽象工廠模式(Abstract Factory):又稱爲工具箱,產生產品族,但不利於產生新的產品;
這三種模式從上到下逐步抽象,並且更具一般性。
簡單工廠模式
1)簡單工廠模式,屬於類的創新型模式,又叫靜態工廠方法模式,是通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類,或實現了統一的接口。
2)簡單工廠模式就是通過一個”全能類”,根據外界傳遞的信息來決定創建哪個具體類的對象。
產品類:
abstract class Iphone {
public Iphone() {
}
}
public class Iphone7 extends
Iphone {
public Iphone7() {
System.out.println("製造-->Iphone7");
}
}
public class Iphone8 extends
Iphone {
public Iphone8() {
System.out.println("製造-->Iphone8");
}
}
工廠類:
public class Factory {
public Iphone createIphone(
int type) {
switch (type) {
case 7:
return new Iphone7();
case 8:
return new Iphone8();
default:
break;
}
return null;
}
}
客戶類:
public class Customer {
public static void main(String[] args) {
Factory factory = new Factory();
Iphone iphone7 =factory.createIphone(7);
Iphone iphone8 =factory.createIphone.(8);
}
}
總結:由以上簡單的幾行代碼可以看出,簡單工廠模式嚴重違背了“開閉原則”,並且難以拓展,所以由此產生了工廠方法模式。
工廠方法模式
1)工廠方法模式,是對簡單工廠模式進行了抽象化,符合“開閉原則”,實現了可擴展。
2)工廠方法模式的意義是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成爲一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
3)工廠方法模式組成:
+ 抽象工廠角色: 這是工廠方法模式的核心,它與應用程序無關。是具體工廠角色必須實現的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現。
+ 具體工廠角色:它含有和具體業務邏輯有關的代碼。由應用程序調用以創建對應的具體產品的對象。
+ 抽象產品角色:它是具體產品繼承的父類或者是實現的接口。在java中一般有抽象類或者接口來實現。
+ 具體產品角色:具體工廠角色所創建的對象就是此角色的實例。在java中由具體的類來實現。
4)工廠方法模式使用繼承自抽象工廠角色的多個子類來代替簡單工廠模式中的“上帝類”。正如上面所說,這樣便分擔了對象承受的壓力;而且這樣使得結構變得靈活 起來——當有新的產品產生時,只要按照抽象產品角色、抽象工廠角色提供的合同來生成,那麼就可以被客戶使用,而不必去修改任何已有 的代碼。可以看出工廠角色的結構也是符合開閉原則的!
5)工廠方法模式使用場景:
如組裝手機的代工廠。從手機原料工廠獲取外殼、顯示屏、主板、按鍵、電池等配件進行組裝。組裝手機工廠只負責手機的裝配,而不負責配件的生產,也不需要關心從手機原料工廠出來的配件是否改變,只要手機各個配置銜接的接口不變就行。比如原料工廠顯示屏從TFT 的換成了UFB的顯示屏,對於組裝手機的代工廠來說,只要接口沒變,只需要繼續裝配就行。
產品類:
abstract class Iphone {
public Iphone(){
}
}
public class Iphone7 extends Iphone {
public Iphone7() {
System.out.println("製造-->Iphone7");
}
}
public class Iphone8 extends Iphone{
public Iphone8(){
System.out.println("製造-->Iphone8");
}
}
創建工廠類:
interface FactoryIphone {
Iphone createIphone();
}
public class FactoryIphone7 implements FactoryIphone {
@Override
public Iphone7 createIphone() {
return new Iphone7();
}
}
public class FactoryIphone8 implements FactoryIphone {
@Override
public Iphone8 createIphone() {
return new Iphone8();
}
}
客戶類:
public class Customer {
public static void main(String[] args) {
FactoryIphone7 factoryIphone7 = new FactoryIphone7();
Iphone7 iphone7 = factoryIphone7.createIphone();
FactoryIphone8 factoryIphone8 = new FactoryIphone8();
Iphone8 iphone8 = factoryIphone8.createIphone();
}
}
總結:
工廠模式的好處就在於提供創建的產品接口給使用者就行,無論產品的類型如何變化,只要根據接口創建的產品的功能沒有變化,使用者就無須做任何變動。
工廠方法模式彷彿已經很完美的對對象的創建進行了包裝,使得客戶程序中僅僅處理抽象產品角色提供的接口,但使得對象的數量成倍增長。當產品種類非常多時,會出現大量的與之對應的工廠對象,這不是我們所希望的。
以上就是簡單工廠模式,工廠方法模式,抽象工廠模式在這裏。