java 設計模式--簡單工廠模式,工廠方法模式,抽象工廠模式

簡單工廠模式:又稱靜態工廠模式,它是用來實例化目標類的靜態類。

工廠方法模式:定義一個用於創建對象的接口,讓子類決定實例化哪一個類,工廠方法使一個類的實例化延遲到一個子類

抽象工廠模式:提供一個創建一系列相關或依賴對象的接串口,而無需指定它們具體的類

兩者都是工廠模式,其目的都是對子類實例化的一個封裝。但區別就在於一個是靜態的,即實例化對象方法是固定的,而下面的實例化對象是由使用者來定義的。

下面我們通過例子來加強理解。

就拿現在的手機來說吧,現在手機的種類有很多很多,而且各式各樣的,如果一個代工工廠代工生產有三種手機,比如諾基來的lumia920,三星的galaxy sIII,iphone 5的(此入打個比方)。三個手機運行着不同的操作系統,一個是wp8,一個android,一個ios,那麼我們定義三個類

首先我們通過簡單工廠模式來實現。

1‘、定義三者的通用接口

public interface  Product()

{

    public void showInfo();

}

2、三個實現

public class LumiaProduct implements Product

{

   public void showInfo()

 {

    System.out.Println("Lumia920 使用微軟最新的windows 8操作系統");

 }

}

public class GalaxyProduct implements Product

{

 public void showInfo()

 {

   System.out.println("三星Galaxy SIII 是三星最新的旗艦機,運行着Android 操作系統");

 }

}

public class IphoneProduct implements Product

{

  public void showInfo()

  {

     System.out.println("iphone 5 是蘋果工司最新的手機,運行着ios操作系統");

  }

}

以上三個類分別表示了三種手機的基本信息。如果就這樣讓客戶端調用的話,完全不符合面向對象的思想了。所以我們對其進行封裝。以提高代碼的重用性,以及代碼的易用性

所以我們利用簡單工廠模式對上述對象進行封裝

public class ProductFactory   //工廠類

{

   Product product;

 public Product createProduct(String pro)

 {

    switch(pro)

     {

        case  "lumia" :

        product=new LumiaProduct();

       break;

         case  "galaxy":

        product=new GalaxyProduct();

         break;

         case  "iphone":

         product=new IphoneProduct();

         break;

     }

     return product;

 }

}

有了上述的工廠類,那麼我們生產起手機來就方便了。

其它程序或函數調用就方便了

Product p;

p=ProductFactory("lumia");

p.showInfo();

p=ProductFactor("galaxy");

p.showInfo();

p=ProductFactory("iphone");

p.showInfo();

從上述的例子中我們可以看出簡單工廠模式的特點,就是實例化類的一個類,可以靈活的輸出相應的子類,當然缺點也是顯然的,如果這個工廠又要多加一款手機的話,那麼要就修改工廠類了,這就不符合開放-封閉原則了。

所以我們就用工廠方法模式來修改,來使之能動態的實例化我們想要的類。

從簡單工廠模式我們可以看出,其中的product接口是對三種手機的一個抽象,在工廠中其它的手機可以由它來表示。那麼我們也定義這樣的接口IFactory,來定義不同了子工廠類。

public interface IFactory()

{

   public  Product createProduct();

}

然後定義子工廠類

class LumiaFactory() implement IFactory

{

   public Product createProduct()

  {

    return new LumiaProduct();

 }

}

class GalaxyFacotry implement IFactory

{

   public Product createProduct();

    {

       return new GalaxyProduct();

    }


}

class IphoneFactory implement IFactory

{

    public Product createProduct()

    {

       return new IphoneProduct();

     }

}

那麼我們在程序或函數中調用就可以方面了。

IFactory factory=new LumiaFactory();

Product pro=factory.createProduct();

pro.showInfo();

其它同理

通過抽像工廠類,我們可以發現,如果要增加一款手機的手產,就不用改類了,只繼承Product 類生成相應的手機類,然後繼承IFactory 生成相就有工廠類就行了,那麼就實現了動態的調用。

那麼接下來我們再看看抽象工廠模式,抽象工廠模式其實是工廠模式的一個括充。比如我們這個工廠加在搞資,要增加平反電腦(我們在這裏認爲是另一種不同的product),那我們如休在原來的基礎上做出修改呢?

首先我們定義抽象

public interface NewProduct()

{

   public void showProduct();

}

public void  iPad implement NewProduct

{

   public void showProduct()

   {

       System.out.println("Apple公司 新作");  

   }

public void NexusTen  implement NewProduct

{

    public void showProduct()

    {

       System.out.println("google公司新出的平板");

       }

}


然後我們要定義工廠類了,於是我們在原先的工廠抽象類裏面,加入新的定義,故IFactory可改爲:

public interface IFactory()

{

   public  Product createProduct();

   public  NewProduct createNewProduct();

}

這樣factor就能生產出新的平板了產品

public void IpadFactory implement IFacotry

{

     public NewProduct createNewProduct()

    {

         return new Ipad();

     }

}

public void NexusTenFactory implement IFactory

{

   public NewProduct createNewProduct()

   {

      return new NexusTen();

    }

}

寫到這大家一定可以發現利用工廠模式的好處了,無論是添加商品的個數,還是種類,都十分的方便,至於在程序中怎麼調用,就比較簡單了。

IFactory facotry=new IphomeFactory();

Product iphone=factory.createProduct();

NewProduct ipad=factory.createNewProduct();

iphone.showInfo();

ipad.showProduct();

大功告成,是不是很神奇。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章