常見設計模式之【原廠模式】

來源:互聯網
上載者:User

 

簡介

原廠模式主要是為建立對象提供了介面。原廠模式按照《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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.