簡單原廠模式是類的建立模式,又叫做靜態Factory 方法(Static Factory Method)模式。
ξ 12.1 原廠模式的幾種形態:
① 簡單工廠(Simple Factory),又稱靜態Factory 方法模式;
② Factory 方法(Factory Method),又稱多態性工廠(Polymorphic Factory)模式或虛擬構造子(Virual Constructor)模式;
③ 抽象工廠(Abstract Factory),又稱工具箱(Kit或Toolkit)模式。
☆ 簡單原廠模式,是不同的Factory 方法模式的一個特殊實現。在java語言中,通常的Factory 方法模式不能通過設計功能的退化給出靜態原廠模式。
ξ 12.2 簡單原廠模式的引進
本節通過一個農場的執行個體來引入簡單原廠模式,農場供應三種水果,他們是Grape、Strawberry和Apple。還有一位園丁FruitGardener,他負責提供客戶需要的水果。他們的UML圖如下:
水果介面定義出所有水果的抽象,具體行為包括種植、生長和收穫,代碼如下:
public interface Fruit
...{
public void grow();
public void harvest();
public void plant();
}
Apple是一種水果,同時由於是多年生植物,多出一個treeAge屬性,代碼如下:
public class Apple implements Fruit
...{
public void grow()
...{
System.out.println( "Apple:grow" ) ;
}
public void harvest()
...{
System.out.println( "Apple:havest" ) ;
}
public void plant()
...{
System.out.println( "Apple:plant" ) ;
}
private int treeAge ;
public int getTreeAge()
...{
return this.treeAge ;
}
public void setTreeAge( int treeAge )
...{
this.treeAge = treeAge ;
}
}
Grape也是一種水果,同時具有seedles屬性區分是否有籽,代碼如下:
public class Grape implements Fruit
...{
private boolean seedless;
public void grow()
...{
System.out.println( "Grape:grow" ) ;
}
public void harvest()
...{
System.out.println( "Grape:havest" ) ;
}
public void plant()
...{
System.out.println( "Grape:plant" ) ;
}
public boolean getSeedless()
...{
return seedless ;
}
public void setSeedless(boolean seedless)
...{
this.seedless = seedless ;
}
}
Strawberry的代碼如下:
public class Strawberry implements Fruit
...{
public void grow()
...{
System.out.println( "Strawberry:grow" ) ;
}
public void harvest()
...{
System.out.println( "Strawberry:havest" ) ;
}
public void plant()
...{
System.out.println( "Strawberry:plant" ) ;
}
}
園丁FruitGardener是農場中的工廠類角色,它負責根據客戶的不同需求(傳入的參數不同)來產生不同的水果。它的代碼如下:
public class FruitGardener
...{
public static Fruit getFruit( String name )
...{
Fruit result = null ;
if ( name.equalsIgnoreCase( "apple" ) )
result = new Apple() ;
else if ( name.equalsIgnoreCase( "grape" ) )
result = new Grape() ;
else if ( name.equalsIgnoreCase( "strawberry" ) )
result = new Strawberry() ;
return result ;
}
}
ξ 12.3 簡單原廠模式的結構
☆ 簡單原廠模式涉及到三個角色:
① 工廠類角色:擔任這個角色的是Factory 方法模式的核心,含有與應用緊密相關的商業邏輯。工廠類在用戶端的直接調用下建立產品對象,它往往由一個具體java類實現。
② 抽象產品角色:擔任這個角色的類是由Factory 方法模式所建立的對象的父類,或它們共同擁有的介面。抽象產品角色可以用一個java介面或者java抽象類別實現。
③ 具體產品角色:Factory 方法模式所建立的任何對象都是這個角色的執行個體,具體產品角色由一個具體java類實現。
ξ 12.4 簡單原廠模式的實現
☆ 對多層次的產品結構,簡單原廠模式統一使用一個工廠類。好處是設計簡單,缺點是新增的產品必將導致工廠類的修改。
☆ 一個工廠類中可以有多個Factory 方法用來返回不同的產品角色
☆ 簡單Factory 方法中角色的省略
① 抽象產品角色的省略,如果系統中只有一個具體產品,可以省略掉抽象產品角色;
② 工廠角色與抽象產品角色合并,典型如java.text.DateFormat;
③ 三個角色全部合并。
ξ 12.5 簡單原廠模式與其他模式的關係
單例、多例模式都是簡單Factory 方法的特殊應用,其他還有備忘錄模式和更進階的MVC模式。
ξ 12.6 簡單原廠模式的優點和缺點
☆ 優點:該模式的核心是工廠類,這個類含有必要的判斷邏輯,可以決定在什麼時候建立哪一個產品類的執行個體。而用戶端則可以免除直接建立產品對象的責任,而僅僅負責消費產品,簡單原廠模式通過這種做法實現了對責任的分割。
☆ 缺點:工廠類擔負太多的邏輯,形成了全能的上帝類;簡單原廠模式的工廠是靜態實現,無法繼承;工廠類通常只能部分滿足開閉原則。