微信公眾號怎樣做淘客網(wǎng)站重慶網(wǎng)站搭建
目錄
什么是抽象工廠模式?
定義
特點
抽象工廠模式(java代碼示例)
首先定義第一個接口?
實現(xiàn)第一個接口的類
定義第二個接口
實現(xiàn)第二個接口的類
?* 創(chuàng)建抽象工廠類
創(chuàng)建擴(kuò)展了 AbstractFactory 的工廠類
????????飲料工廠
????????食物工廠
?* 創(chuàng)建一個工廠生成器類
測試類:
運(yùn)行結(jié)果:
抽象工廠模式的優(yōu)缺點
優(yōu)點:
缺點:
總結(jié):
什么是抽象工廠模式?
定義
抽象工廠模式(Abstract Factory Pattern),它圍繞一個超級工廠創(chuàng)建其他工廠。該超級工廠又稱為其他工廠的工廠。它也是一種創(chuàng)建型設(shè)計模式,提供了一種創(chuàng)建對象的最佳方式。
特點
在抽象工廠模式中,接口是負(fù)責(zé)創(chuàng)建一個相關(guān)對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。
抽象工廠模式提供了一種創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定具體實現(xiàn)類。通過使用抽象工廠模式,可以將客戶端與具體產(chǎn)品的創(chuàng)建過程解耦,使得客戶端可以通過工廠接口來創(chuàng)建一族產(chǎn)品。
抽象工廠模式(java代碼示例)
首先定義第一個接口?
(飲料:Drinks)
public interface Drinks {void product();
}
實現(xiàn)第一個接口的類
(類:茶、可樂、礦泉水)
public class Tea implements Drinks {@Overridepublic void product(){System.out.println("飲料——茶");}
}
public class Cola implements Drinks {@Overridepublic void product(){System.out.println("飲料——可樂");}
}
public class MineralWater implements Drinks {@Overridepublic void product(){System.out.println("飲料——礦泉水");}
}
定義第二個接口
(食物:Foods)
public interface Foods {void product();
}
實現(xiàn)第二個接口的類
public class Chicken implements Foods {@Overridepublic void product(){System.out.println("食物——雞肉");}
}
public class Beaf implements Foods {@Overridepublic void product(){System.out.println("食物——牛肉");}
}
public class Fish implements Foods {@Overridepublic void product(){System.out.println("食物——魚肉");}
}
.......................................
????????????????( 相似地,可以繼續(xù)定義n個接口,然后用類實現(xiàn)這些接口。)
?* 創(chuàng)建抽象工廠類
public abstract class AbstractFactory {public abstract Drinks getDrinks(String drinks);public abstract Foods getFoods(String foods);//上邊創(chuàng)建了多少被實現(xiàn)的接口,這里就可以創(chuàng)建多少個方法
}
????????????????(上邊創(chuàng)建了多少被實現(xiàn)的接口,這里就可以創(chuàng)建多少個方法)
創(chuàng)建擴(kuò)展了 AbstractFactory 的工廠類
(基于給定的信息生成實體類的對象)
????????飲料工廠
public class DrinksFactory extends AbstractFactory {@Overridepublic Drinks newDrinks(String DrinksType){if(DrinksType.equals(("茶"))){return new Tea();}else if(DrinksType.equals("可樂")){return new Cola();}else if(DrinksType.equals("礦泉水")){return new MineralWater();}else {System.out.println("暫時沒有這種飲料");return null;}}@Overridepublic Foods newFoods(String FoodsType){return null;}
}
????????食物工廠
public class FoodsFactory extends AbstractFactory {@Overridepublic Drinks newDrinks(String DrinksType){return null;}@Overridepublic Foods newFoods(String FoodsType){if(FoodsType.equals(("雞肉"))){return new Chicken();}else if(FoodsType.equals("魚肉")){return new Fish();}else if(FoodsType.equals("牛肉")){return new Beaf();}else {System.out.println("暫時沒有這種食物");return null;}}
}
? ? ? ? ? (這里麻煩的是,每一個具體的工廠,沒有辦法只重載自己所需要的方法,都需要將 AbstractFactory 中所有的方法@Override。否則會報錯,這是抽象工廠模式的缺點之一。)
?* 創(chuàng)建一個工廠生成器類
(通過傳遞 “選擇” 信息來獲取工廠)
public class FactoryProducer {public static AbstractFactory getFactory(String choice){if(choice.equalsIgnoreCase("食物")){return new FoodsFactory();} else if(choice.equalsIgnoreCase("飲料")){return new DrinksFactory();}else {System.out.println("暫時沒有該工廠");return null;}}
}
測試類:
public class Test {public static void main(String[] args) {AbstractFactory foodsFactory = FactoryProducer.getFactory("食物");AbstractFactory foodsFactory2 = FactoryProducer.getFactory("飲料");AbstractFactory foodsFactory3 = FactoryProducer.getFactory("衣服");Foods foods = foodsFactory.newFoods("魚肉");foods.product();Foods foods2 = foodsFactory.newFoods("雞肉");foods2.product();Foods foods3 = foodsFactory.newFoods("牛肉");foods3.product();Foods foods4 = foodsFactory.newFoods("豬肉");Drinks drinks = foodsFactory2.newDrinks("可樂");drinks.product();Drinks drinks2 = foodsFactory2.newDrinks("礦泉水");drinks.product();Drinks drinks3 = foodsFactory2.newDrinks("茶");drinks.product();Drinks drinks4 = foodsFactory2.newDrinks("啤酒");}
}
運(yùn)行結(jié)果:
抽象工廠模式的優(yōu)缺點
優(yōu)點:
客戶端獨立于具體的實現(xiàn)類:客戶端使用抽象工廠來創(chuàng)建產(chǎn)品,而不需要關(guān)心具體的實現(xiàn)類。這樣可以降低客戶端與具體實現(xiàn)類之間的耦合度。
易于切換產(chǎn)品系列:由于客戶端只使用抽象工廠來創(chuàng)建產(chǎn)品,所以只需要切換具體的工廠實現(xiàn)類,就可以切換到不同的產(chǎn)品系列。
確保產(chǎn)品組合的一致性:每個具體工廠負(fù)責(zé)創(chuàng)建一個產(chǎn)品系列,這確保了產(chǎn)品之間的一致性。
支持產(chǎn)品等級結(jié)構(gòu):抽象工廠模式提供了一種支持產(chǎn)品等級結(jié)構(gòu)的方式,可以很容易地增加新的產(chǎn)品。
缺點:
難以支持新種類的產(chǎn)品:如果需要添加一個新種類的產(chǎn)品,則需要修改抽象工廠接口以及所有的具體工廠實現(xiàn)。 (上述java代碼 “ 創(chuàng)建擴(kuò)展了 AbstractFactory 的工廠類 ” 中@Override)
由于引入了抽象層,增加了系統(tǒng)的抽象性和理解難度。對于不熟悉該模式的開發(fā)人員來說,理解工廠方法的作用和應(yīng)用場景可能會有一些困難。
總結(jié):
抽象工廠模式與工廠模式都使客戶端使用抽象工廠來創(chuàng)建產(chǎn)品,而不需要關(guān)心具體的實現(xiàn)類。
抽象工廠模式可以很容易的增加某個種類里的新產(chǎn)品,但是增加新種類有些許困難(舉例:在“飲料”中增加新飲品“雪碧”很簡單,但在“工廠”中增加新的“甜品工廠”難)