簡單工廠模式:又稱靜態工廠模式,它是用來實例化目標類的靜態類。
工廠方法模式:定義一個用於創建對象的接口,讓子類決定實例化哪一個類,工廠方法使一個類的實例化延遲到一個子類
抽象工廠模式:提供一個創建一系列相關或依賴對象的接串口,而無需指定它們具體的類
兩者都是工廠模式,其目的都是對子類實例化的一個封裝。但區別就在於一個是靜態的,即實例化對象方法是固定的,而下面的實例化對象是由使用者來定義的。
下面我們通過例子來加強理解。
就拿現在的手機來說吧,現在手機的種類有很多很多,而且各式各樣的,如果一個代工工廠代工生產有三種手機,比如諾基來的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();
大功告成,是不是很神奇。。。。