標籤:
抽象原廠模式特點
抽象原廠模式與原廠模式最大的區別是每個單獨的產品是一個原廠模式,而多個不同產品互動則是抽象原廠模式,抽象原廠模式通常要運用原廠模式的方法。通常,原廠模式的所有產品的建立都放在這個工廠裡面,如果產品有所變更,則需要修改該Factory 方法,違反了設計模式的開閉原則——對擴充開放,對修改關閉。而抽象原廠模式則認為當需要建立一個新的產品時,也建立一個新的工廠即可,不需要修改任何之前已有的代碼。
抽象工廠案例圖
從可以看出,如果要開發一個搜尋的功能,而搜尋功能又分為圖片搜尋和新聞搜尋,圖片搜尋又可以再開發新功能,如風景圖片搜尋、明星圖片搜尋、動漫圖片搜尋;同樣新聞搜尋又可以再開發新功能,如文化新聞搜尋、科技新聞搜尋、經濟新聞搜尋。對於這樣的一個強大的功能,可以使用抽象原廠模式,例如可以建一個搜尋工廠,用於建立圖片搜尋和新聞搜尋的介面,然後再定義兩個小工廠,圖片工廠和新聞工廠,實現搜尋工廠這個介面,並且可以建立具體的搜尋功能執行個體。
案例的具體代碼實現
首先定義一個可搜尋的介面,所有的被搜尋對象均要實現這個介面,才可以被搜尋到:
package com.factory.abstractFactory;public interface Searchable {public void get();}
定義搜尋工廠介面,內部定義search()方法,任何一個子工廠都要實現該方法:
package com.factory.abstractFactory;public interface SearchFactory {public Searchable search();}
圖片搜尋工廠
定義圖片搜尋的三個功能:
package com.factory.abstractFactory;public class ViewPic implements Searchable {@Overridepublic void get() {System.out.println("風景圖片搜尋");}}
package com.factory.abstractFactory;public class StarPic implements Searchable {@Overridepublic void get() {System.out.println("明星圖片搜尋");}}
package com.factory.abstractFactory;public class AnimationPic implements Searchable {@Overridepublic void get() {System.out.println("動漫圖片搜尋");}}
分別定義三個圖片搜尋工廠:
package com.factory.abstractFactory;public class ViewPicFactory implements SearchFactory {@Overridepublic Searchable search() {return new ViewPic();}}
package com.factory.abstractFactory;public class StarPicFactory implements SearchFactory {@Overridepublic Searchable search() {return new StarPic();}}
package com.factory.abstractFactory;public class AnimationPicFactory implements SearchFactory{@Overridepublic Searchable search() {return new AnimationPic();}}
新聞搜尋工廠
定義新聞搜尋的三個功能:
package com.factory.abstractFactory;public class CultureNews implements Searchable{@Overridepublic void get() {System.out.println("文化新聞搜尋");}}
package com.factory.abstractFactory;public class TechNews implements Searchable {@Overridepublic void get() {System.out.println("科技新聞搜尋");}}
package com.factory.abstractFactory;public class EconomicNews implements Searchable{@Overridepublic void get() {System.out.println("經濟新聞搜尋");}}
分別定義三個新聞搜尋工廠:
package com.factory.abstractFactory;public class CultureNewsFactory implements SearchFactory {@Overridepublic Searchable search() {return new CultureNews();}}
package com.factory.abstractFactory;public class TechNewsFactory implements SearchFactory {@Overridepublic Searchable search() {return new TechNews();}}
package com.factory.abstractFactory;public class EconomicNewsFactory implements SearchFactory {@Overridepublic Searchable search() {return new EconomicNews();}}
測試代碼
package com.factory.abstractFactory;public class Test {public static void main(String[] args) {//搜尋風景圖片SearchFactory viewPicFactory = new ViewPicFactory();Searchable search1 = viewPicFactory.search();search1.get();//搜尋明星圖片SearchFactory starPicFactory = new StarPicFactory();Searchable search2 = starPicFactory.search();search2.get();//搜尋動漫圖片SearchFactory animationPicFactory = new AnimationPicFactory();Searchable search3 = animationPicFactory.search();search3.get();//搜尋科技新聞SearchFactory techNewsFactory = new TechNewsFactory();Searchable search4 = techNewsFactory.search();search4.get();//搜尋經濟新聞SearchFactory economicNewsFactory = new EconomicNewsFactory();Searchable search5 = economicNewsFactory.search();search5.get();//搜尋文化新聞SearchFactory cultureNewsFactory = new CultureNewsFactory();Searchable search6 = cultureNewsFactory.search();search6.get();}}
測試結果:
風景圖片搜尋明星圖片搜尋動漫圖片搜尋科技新聞搜尋經濟新聞搜尋文化新聞搜尋
抽象原廠模式的適用性
上面的例子可以再次擴充,只用添加做一個功能實作類別,並且實現Searchable介面,同時建立一個產品工廠即可,還可以進行產品之間功能的耦合。抽象原廠模式可以適用於一個系統獨立於產品的建立組合和表示,或者只想提供一個產品類庫的介面,不想提供實現的時候。
Java設計模式之抽象原廠模式