簡介
原廠模式主要是為建立對象提供了介面。原廠模式按照《Java與模式》中的提法分為三類:
1. 簡單原廠模式(Simple Factory)
2. Factory 方法模式(Factory Method)
3. 抽象原廠模式(Abstract Factory)
這三種模式從上到下逐步抽象,並且更具一般性。還有一種分類法,就是將簡單原廠模式看為Factory 方法模式的一種特例,兩個歸為一類。下面是使用原廠模式的兩種情況:
1.在編碼時不能預見需要建立哪種類的執行個體。
2.系統不應依賴於產品類執行個體如何被建立、組合和表達的細節
例子:
如果生活中有兩種燈一種是燈泡,另一種是燈管,它們都有個方法發亮shine(),有兩個人,一個人會做燈泡,一個人會做燈管,他們兩個各自做各自的。如果我要訂兩批燈一批是燈泡一批是燈管的話。那我要分別派人去找兩個人分別談判、溝通兩次,再分別派人取貨,但有一天我派去取貨的人喝醉了,去做燈泡的人那裡去要燈管,又去做燈管的人那裡取燈泡,這樣可就出錯了。後來這兩個人合做開了一家燈工廠,擁有兩條生產線,這個工廠能同時造燈泡和燈管,那我只需與這家工廠談判一次就可以了,也只需派人來這個工廠的銷售部取貨就可以了。當然銷售部不能只銷售燈泡,也不能只銷售燈管,是二者都銷售,根據訂單不同銷售的內容也不同。
一、簡單原廠模式
1>工廠類角色:SimpleFactory這是本模式的核心,含有一定的商業邏輯和判斷邏輯。在java中它往往由一個具體類實現。
2>抽象產品角色:Light 它一般是具體產品繼承的父類或者實現的介面。在java中由介面或者抽象類別來實現。
3>具體產品角色:bulb和tube廠類所建立的對象就是此角色的執行個體。在java中由一個具體類實現。
abstract class Light{ public abstract void shine();}class BulbLight extends Light{ public void shine(){ System.out.println("Bulb Light is shine"); }}class TubeLight extends Light{ public void shine(){ System.out.println("Tube Light is thrn on"); }}class SimpleFactory{public static Light creator(String name){ if(name.equal("Bulb")){ return new BulbLight(); }else if(name.equal("Tube")){ return new TubeLight(); }}}public class Test{ public static void main(String[] args){ SimpleFactory sf=new SimpleFactory(); Light bulb=sf.creator("Bulb"); bulb.shine(); Light tube=sf.creator("Tube"); tube.shine(); }}
二、Factory 方法模式
1>抽象工廠角色:Light中這是Factory 方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。在java中它由抽象類別或者介面來實現
2>具體工廠角色:它含有和具體商務邏輯有關的代碼。由應用程式調用以建立對應的具體產品的對象。在java中它由具體的類來實現。
3>抽象產品角色:Light它是具體產品繼承的父類或者是實現的介面。在java中一般有抽象類別或者介面來實現。
3>具體產品角色:bulb和tube具體工廠角色所建立的對象就是此角色的執行個體。在java中由具體的類來實現。
public class Test{ public static void main(String[] args){ IFactoryLight factory =new FactoryLight(); Light light=factory.createLight("BulbLight"); light.shine(); }}interface IFactoryLight{ public Light createLight(String name);}class FactoryLight implements IFactoryLight{ @Override public Light createLight(String name){ if(name.equals("BulbLight")){ return new BulbLight();}else if(name.equals("TubeLight")){ return new TubeLight();} return null; }}interface Light{ public void shine();}class BulbLight implements Light{ public void shine(){ System.out.println("Bulb Light is shine"); }}class TubeLight implements Light{ public void shine(){ System.out.println("Tube Light is shine"); }}
三、抽象原廠模式
例子:
如果上面例子中要生產一種新產品-探照燈,那就得把原來的兩條生產線進行大的修改,生產完成後再把生產線改回來,這樣就太影響工作了,於是他們想出了一個方法再建一條生產線,專門生產探照燈。
1>抽象工廠角色:Creator是Factory 方法模式的核心,與應用程式無關。任何在模式中建立的對象的工廠類必須實現這個介面。
2>具體工廠角色:BulbCreator與TubeCreator這是實現抽象工廠介面的具體工廠類,包含與應用程式密切相關的邏輯,並且受到應用程式調用以建立產品對象。
3>抽象產品角色:LightFactory 方法模式所建立的對象的超類型,也就是產品對象的共同父類或共同擁有的介面。
4>具體產品角色:bulb和tube這個角色實現了抽象產品角色所定義的介面。某具體產品有專門的具體工廠建立,它們之間往往一一對應
/** * 抽象原廠模式 * @author potter */public class Test{ public static void main(String[] args){BulbFactory bulbFactory=new BulbFactory();TubeFactory tubeFactory=new TubeFactory(); BulbLight bulb=(BulbLight) bulbFactory.create(); bulb.shine(); TubeLight tube=(TubeLight) tubeFactory.create(); tube.shine(); }}interface Light{ public abstract void shine();}class BulbLight implements Light{ public void shine(){ System.out.println("Bulb Light is shine"); }}class TubeLight implements Light{ public void shine(){ System.out.println("Tube Light is shine"); }}abstract class Factory{ public abstract Light create();}class BulbFactory extends Factory{ public Light create(){ return new BulbLight(); }}class TubeFactory extends Factory{ public Light create(){ return new TubeLight(); }}
這是我對原廠模式在java中的理解,歡迎各位來點評,指正說的不準確或者有誤的地方,也歡迎大家對說的不全來進行補充
參考文章:
http://baike.baidu.com/view/1306799.htm
http://hi.baidu.com/grayworm/blog/item/4a832160f8c9de46eaf8f8c1.html
http://blog.csai.cn/user1/25929/archives/2009/35622.html