模式定義
為創(chuàng)建一組相關或相互依賴的對象提供一個接口,而且無需指定他們的具體類。
模式結構
代碼實現(xiàn)
//早餐工廠
public interface BreakfastFactory {
Food makeFood();
Drink makeDrink();
}
//飲料工廠
public interface Drink {
void drink();
}
//實現(xiàn)類
public class EastDrink implements Drink {
public void drink() {
System.out.println("喝豆?jié){");
}
}
public class WestDrink implements Drink {
public void drink() {
System.out.println("喝牛奶");
}
}
//主食工廠
public interface Food {
void eat();
}
//實現(xiàn)類
public class EastFood implements Food {
public void eat() {
System.out.println("吃油條");
}
}
public class WestFood implements Food {
public void eat() {
System.out.println("吃面包");
}
}
//早餐工廠實現(xiàn)類(中式早餐)
public class EastBreakfast implements BreakfastFactory {
public Food makeFood() {
return new EastFood();
}
public Drink makeDrink() {
return new EastDrink();
}
}
//西式早餐
public class WestBreakfast implements BreakfastFactory {
public Food makeFood() {
return new WestFood();
}
public Drink makeDrink() {
return new WestDrink();
}
}
public class Client {
public static void main(String[] args) {
System.out.println("**********第一天吃西餐***********");
BreakfastFactory breakfast = new WestBreakfast();
breakfast.makeDrink().drink();
breakfast.makeFood().eat();
System.out.println("**********第一天吃中餐***********");
breakfast = new EastBreakfast();
breakfast.makeDrink().drink();
breakfast.makeFood().eat();
}
}
運行結果:
**********第一天吃西餐***********
喝牛奶
吃面包
**********第一天吃中餐***********
喝豆?jié){
吃油條
模式的優(yōu)缺點
優(yōu)點
分離接口和實現(xiàn)
客戶端使用抽象工廠來創(chuàng)建需要的對象,而客戶端根本就不知道具體的實現(xiàn)是誰,客戶端只是面向產(chǎn)品的接口編程而已。也就是說削彬,客戶端從具體的產(chǎn)品實現(xiàn)中解耦。使得切換產(chǎn)品簇變的容易
比如上面的例子:中餐是喝豆?jié){秀仲、吃油條融痛;西餐是喝牛奶、吃面包神僵。你也可以將中餐改為喝豆?jié){雁刷、吃面包。
缺點
不太容易擴展新的產(chǎn)品
容易造成類層次復雜
舉個例子來說:比如DAO保礼,現(xiàn)在DAO只有一個選擇的層次沛励,也就是選擇是使用關系型數(shù)據(jù)庫來實現(xiàn)责语,還是使用XML實現(xiàn)。現(xiàn)在考慮這樣一種情況目派,如果關系型數(shù)據(jù)庫實現(xiàn)里面又分成幾種坤候,比如,基于Oracle的實現(xiàn)企蹭、基于SqlServer的實現(xiàn)白筹、基于MySQL的實現(xiàn)等。
那么客戶端怎么選擇呢谅摄?不會把所有的實現(xiàn)情況全都做到一個層次上吧徒河,這個時候客戶端就需要一層一層地選擇,也就是整個抽象工廠的實現(xiàn)也需要分出層次來送漠,每一層負責一種選擇顽照,也就是一層屏蔽一種變化,這樣很容易造成復雜的類層次結構闽寡。
思考
模式本質:選擇產(chǎn)品簇的實現(xiàn)代兵。
開發(fā)中的應用場景
如果希望一個系統(tǒng)獨立于它的產(chǎn)品的創(chuàng)建、組合和表示的時候下隧。換句話說奢人,希望一個系統(tǒng)只是知道產(chǎn)品的接口谓媒,而不關心實現(xiàn)的時候淆院。
可以動態(tài)的切換產(chǎn)品簇的時候。
如果要強調一系列相關產(chǎn)品的接口句惯,以便聯(lián)合使用它們的時候土辩。