1. 程式人生 > >java設計模式--工廠模式

java設計模式--工廠模式

1.工程模式定義

這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的物件。

一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延伸到其子類。

工程模式的思路:

    1.設計一個公共的介面;

    2.分別設計具體的類去實現介面;

    3.設計一個類來決定決定例項化哪一個工廠物件;(工廠類)

工廠模式類圖:

如圖所示,Commodity抽象類負責定義產品的共性,實現對事物最抽象的定義,Creator為抽象工廠類,具體如何建立產品類由具體的實現工廠SpecificCreator來完成。我們來看一下通用的模板程式碼:

public abstract class Commodity {

	public  void Method(){//公共的方法,不需要實現。
		System.out.println("我是公共方法");
	}; 
	
	public abstract void PersonalMethod();//私有方法,需要具體實現

}

  具體商品類可以有多個,都繼承與抽象類Commodity,如下:

public class SpecificCommodityA extends Commodity {
	@Override
	public void PersonalMethod() {
		System.out.println("我要實現A商品");
		
	}
}
public class SpecificCommodityB extends Commodity{

	@Override
	public void PersonalMethod() {
		System.out.println("我要實現B商品");
	}
}

抽象工廠負責商品具體物件的生產 ,如下

public abstract class Creator {

	public abstract <T extends Commodity> T getSpecificCommodityA(Class<T> clazz);

}

具體的工廠繼承抽象工廠類,重寫其中的方法,建立不同的具體商品物件。

public class SpecificCreator extends Creator{
	@Override
	public <T extends Commodity> T getSpecificCommodityA(Class<T> clazz) {
		Commodity com = null;
		try {
			com = (Commodity)Class.forName(clazz.getName()).newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return (T)com;
	}
}

通過這樣的設計就可以生產不同的產品物件,測試類如下:

public class FactoryTest {

	public static void main(String[] args) {
		Creator creator = new SpecificCreator();
		Commodity A = creator.getSpecificCommodityA(SpecificCommodityA.class);
		Commodity B = creator.getSpecificCommodityA(SpecificCommodityB.class);
		A.Method();
		B.Method();
		A.PersonalMethod();
		B.PersonalMethod();
	}
}

下面是輸入結果:
我是公共方法
我是公共方法
我要實現A商品
我要實現B商品

2.工廠模式的優點和缺點

優點: 

1、一個呼叫者想建立一個物件,只要知道其名稱就可以了。

2、擴充套件性高,如果想增加一個產品,只要擴充套件一個工廠類就可以。

3、遮蔽產品的具體實現,呼叫者只關心產品的介面。

缺點:

每次增加一個產品時,都需要增加一個具體類和物件實現工廠,使得系統中類的個數成倍增加,

在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。這並不是什麼好事。