Android設計模式(十二)--抽象工廠模式

問題:

抽象工廠模式,是一個,狠惡心的模式,那麼這個模式在Android有沒有用到過呢?



1、定義:

抽象工廠模式:爲創建一組相關或者是相互依賴的對象提供一個接口,而不需要指定他們的具體類。


2、使用:

     2.1、不依賴於產品類實例如何被創建,組合和表達的細節;

     2.2、產品有多於一個的產品族,而系統只消費其中某一族的產品;

     2.3、同屬於同一個產品族是在一起使用的;

     2.4、提供一個產品類的庫,所有產品以同樣的接口出現,從而使使用者不依賴於實現;


3、與工廠方法的區別:

     3.1、抽象工廠是面向一個工廠方法的升級;

     3.2、抽象方法提供的是一個產品族,即多個產品等級結構,而工廠方法則是針對一個產品等級結構;

     3.3、抽象方法提供的產品是衍生自多個抽象或者接口,而工廠方法則衍生自同一個抽象或者接口;


4、優點:

     4.1、由於是工廠方法的升級,因此繼承了工廠方法的所有優點;

     4.2、可以在內部對產品族的產品進行相應的約束;

     4.3、方便的切換產品族;


5、缺點:

     5.1、不易拓展。新的產品族出現,抽象工廠以及相應的實現都需要修改;


6、最終的目的:

    設計模式的目的最終是爲了解除耦合,那麼使用時,當工廠方法,添加某些方法,而形成的產品族時,便成爲了抽象工廠,當抽象工廠減少某些方法變的單一時,便成爲工廠方法。使用模式僅僅爲了更好的維護與拓展。


7、簡單的demo:

在彩票中有雙色球,大樂透,等彩種,也有各種地方性的彩種,爲了demo的方便,我將SSQ,DLT也劃分爲地方性彩種;

每個地方,都有這兩個彩種,從而形成產品族。

package com.example.demo.AbstractFactory;
/**
 *  抽象工廠,得到產品
 * @author qubian
 * @data 2015年6月12日
 * @email [email protected]
 *
 */
public interface LotteryFactory {

	public LotterySSQ getSSQ();
	
	public LotteryDLT getDLT();
	
}
package com.example.demo.AbstractFactory;
/**
 * 產品接口
 * @author qubian
 * @data 2015年6月12日
 * @email [email protected]
 *
 */
public interface LotterySSQ {
	
	public String getRandom(int num);
}
package com.example.demo.AbstractFactory;
/**
 * 產品接口
 * @author qubian
 * @data 2015年6月12日
 * @email [email protected]
 *
 */
public interface LotteryDLT {

	public String getRandom(int num);
}

具體工廠:

package com.example.demo.AbstractFactory;
/**
 * 具體工廠 湖北工廠
 * @author qubian
 * @data 2015年6月12日
 * @email [email protected]
 *
 */
public class HBFactory implements LotteryFactory{

	@Override
	public LotterySSQ getSSQ() {
		return new HBssq();
	}

	@Override
	public LotteryDLT getDLT() {
		return new HBdlt();
	}

}
package com.example.demo.AbstractFactory;
/**
 * 具體產品 湖北雙色球
 * @author qubian
 * @data 2015年6月12日
 * @email [email protected]
 *
 */
public class HBssq implements LotterySSQ{

	@Override
	public String getRandom(int num) {
		return null;
	}

}
package com.example.demo.AbstractFactory;
/**
 * 具體產品,湖北大樂透
 * @author qubian
 * @data 2015年6月12日
 * @email [email protected]
 *
 */
public class HBdlt implements LotteryDLT{

	@Override
	public String getRandom(int num) {
		// TODO Auto-generated method stub
		return null;
	}

}
package com.example.demo.AbstractFactory;
/**
 * 具體工廠 湖南工廠
 * @author qubian
 * @data 2015年6月12日
 * @email [email protected]
 *
 */
public class HNFactory implements LotteryFactory{

	@Override
	public LotterySSQ getSSQ() {
		return null;
	}

	@Override
	public LotteryDLT getDLT() {
		return null;
	}

}

具體使用:

package com.example.demo.AbstractFactory;

/**
 * 使用
 * @author qubian
 * @data 2015年6月12日
 * @email [email protected]
 *
 */
public class UseAbstractFactory {

	public void use()
	{
		// 使用時的產品族 可以隨時方便切換
//		LotteryFactory factory = new HNFactory();
		LotteryFactory factory = new HBFactory();
		LotterySSQ ssq = factory.getSSQ();
		ssq.getRandom(7);
		LotteryDLT dlt =factory.getDLT();
		dlt.getRandom(8);
		
		
	}
}

8、Android的說明:

由於抽象工廠不易於拓展新的產品族,所以這種設計模式,在提供對外部人員訪問時,很少使用,所以在Android源碼中,基本是沒有這種設計模式,當然或許也是我沒有找到吧,不過我想應該是沒有的。


9、運用最爲典範:

     9.1 模式設計之初:就是爲了適應在Unix與Windows兩個操作系統下的視圖(按鈕Button,TextView等),而構建視圖族,視圖族中有各自不同的實現;

     9.2在java 的連接數據庫的操作中,對不同的數據庫的操作而形成的對象操作族,就是一種很好的模式設計;但是當再次更換數據時,所需要造成的接口的修改也是十分噁心,所以這種模式拓展性不好!

當然,既然模式設計出來就有其優點與可用性,只是暫時在Android源碼中沒有發現,或許可以在自己的代碼中實現,同時也期待和等待出現的驚喜!


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