簡單工廠模式是類的創建模式,又叫靜態工廠方法(static factory method)模式。簡單工廠模式就是由一個工廠類根據傳入的參數決定創建哪一種的產品類。
工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。工廠方法模式的對簡單工廠模式進行了抽象。有一個抽象的Factory類(可以是抽象類和接口),這個類將不在負責具體的產品生產,而是只制定一些規范,具體的生產工作由其子類去完成。在這個模式中,工廠類和產品類往往可以依次對應。即一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品,這個具體的工廠就負責生產對應的產品。
抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。根據LSP原則,任何接受父類型的地方,都應當能夠接受子類型。因此,實際上系統所需要的,僅僅是類型與這些抽象產品角色相同的一些實例,而不是這些抽象產品的實例。換言之,也就是這些抽象產品的具體子類的實例。工廠類負責創建抽象產品的具體子類的實例。
應用場景:現在以一個生活中很常見的例子作為舉例,說明各個工廠模式的應用。一般果園中會有各種各樣的水果,每類水果都配有一個園丁。
簡單工廠模式:起初果園規模不大,所有水果有一個園丁管理。
抽象產品Fruit:
1 public interface Fruit { 2 void fruitType(); 3 }
具體產品:
1 public class Apple implements Fruit { 2 @Override 3 public void fruitType() { 4 System.out.println("這個是蘋果"); 5 } 6 7 } 8 public class Grape implements Fruit{ 9 @Override 10 public void fruitType() { 11 System.out.println("這個是葡萄"); 12 } 13 }
工廠:
1 public class FruitFactory { 2 public static Fruit factory(String fruit){ 3 if("apple".equalsIgnoreCase(fruit)){ 4 return new Apple(); 5 }else if("grape".equalsIgnoreCase(fruit)){ 6 return new Grape(); 7 }else{ 8 return null; 9 } 10 } 11 }
簡單工廠模式的優點:由工廠實現業務邏輯來判斷產品的創建時機,而客戶端只需要向工廠提供需要的產品,然後等待工廠返回使用即可。
簡單工廠模式的缺點:將所有的業務邏輯放在一個工廠方法中,當這個工廠方法不能使用時整個系統將崩潰,同時如果需要擴展新的產品,需要重新修改工廠方法,可擴展性比較差。
工廠方法模式:隨著果園規模的擴大,一個園丁管理起來比較費時,於是引入了多個園丁。
產品接口和產品實現如上:
工廠接口:
1 public interface Fruit { 2 void fruitType(); 3 }
具體接口:
1 public class AppleFactory implements Factory{ 2 @Override 3 public Fruit createFactory() { 4 // TODO Auto-generated method stub 5 return new Apple(); 6 } 7 } 8 public class GrapeFactory implements Factory{ 9 @Override 10 public Fruit createFactory() { 11 // TODO Auto-generated method stub 12 return new Grape(); 13 } 14 }
可以看出,工廠方法模式是簡單工廠模式的推廣,對於新增加的產品類型只要集成工廠接口,繼續分配相應的園丁或者在現有工廠實現的基礎上進行修改即可。
抽象工廠模式:當果園規模又進行了擴大,蘋果、葡萄種類也進行了擴展,產生了一個產品族,需要更加細化管理。
抽象工廠:
1 public interface Factory1 { 2 Fruit createFactory1(); 3 Fruit createFactory2(); 4 }
抽象工廠模式實現:
1 public class AppleFactory1 implements Factory1{ 2 @Override 3 public Fruit createFactory1() { 4 // TODO Auto-generated method stub 5 return new Apple1(); 6 } 7 @Override 8 public Fruit createFactory2() { 9 // TODO Auto-generated method stub 10 return new Apple2(); 11 } 12 13 }
抽象工廠模式優點: 抽象工廠模式除了具有工廠方法模式的優點外,最主要的優點就是可以在類的內部對產品族進行約束。所謂的產品族,一般或多或少的都存在一定的關聯,抽象工廠模式就可以在類內部對產品族的關聯關系進行定義和描述,而不必專門引入一個新的類來進行管理。
抽象工廠模式缺點:產品族的擴展將是一件十分費力的事情,假如產品族中需要增加一個新的產品,則幾乎所有的工廠類都需要進行修改。所以使用抽象工廠模式時,對產品等級結構的劃分是非常重要的。
無論是簡單工廠模式,工廠方法模式,還是抽象工廠模式,他們都屬於工廠模式,在形式和特點上也是極為相似的,他們的最終目的都是為了解耦。在使用時,我們不必去在意這個模式到底工廠方法模式還是抽象工廠模式,因為他們之間的演變常常是令人琢磨不透的。經常你會發現,明明使用的工廠方法模式,當新需求來臨,稍加修改,加入了一個新方法後,由於類中的產品構成了不同等級結構中的產品族,它就變成抽象工廠模式了;而對於抽象工廠模式,當減少一個方法使的提供的產品不再構成產品族之後,它就演變成了工廠方法模式。
所以,在使用工廠模式時,只需要關心降低耦合度的目的是否達到了。