問題:
抽象工廠模式,是一個,狠惡心的模式,那麼這個模式在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源碼中沒有發現,或許可以在自己的代碼中實現,同時也期待和等待出現的驚喜!