抽象工廠模式與工廠模式最大的區別是每一個單獨的產品是一個工廠模式,而多個不一樣產品交互則是抽象工廠模式,抽象工廠模式一般要運用工廠模式的方法。一般,工廠模式的全部產品的建立都放在這個工廠裏面,若是產品有所變動,則須要修改該工廠方法,違反了設計模式的開閉原則——對擴展開放,對修改關閉。而抽象工廠模式則認爲當須要建立一個新的產品時,也建立一個新的工廠便可,不須要修改任何以前已有的代碼。 java
從上圖能夠看出,若是要開發一個搜索的功能,而搜索功能又分爲圖片搜索和新聞搜索,圖片搜索又能夠再開發新功能,如風景圖片搜索、明星圖片搜索、動漫圖片搜索;一樣新聞搜索又能夠再開發新功能,如文化新聞搜索、科技新聞搜索、經濟新聞搜索。對於這樣的一個強大的功能,能夠使用抽象工廠模式,例如能夠建一個搜索工廠,用於建立圖片搜索和新聞搜索的接口,而後再定義兩個小工廠,圖片工廠和新聞工廠,實現搜索工廠這個接口,而且能夠建立具體的搜索功能實例。 設計模式
首先定義一個可搜索的接口,全部的被搜索對象均要實現這個接口,才能夠被搜索到: ide
package com.factory.abstractFactory; public interface Searchable { public void get(); }
package com.factory.abstractFactory; public interface SearchFactory { public Searchable search(); }
package com.factory.abstractFactory; public class ViewPic implements Searchable { @Override public void get() { System.out.println("風景圖片搜索"); } }
package com.factory.abstractFactory; public class StarPic implements Searchable { @Override public void get() { System.out.println("明星圖片搜索"); } }
package com.factory.abstractFactory; public class AnimationPic implements Searchable { @Override public void get() { System.out.println("動漫圖片搜索"); } }
package com.factory.abstractFactory; public class ViewPicFactory implements SearchFactory { @Override public Searchable search() { return new ViewPic(); } }
package com.factory.abstractFactory; public class StarPicFactory implements SearchFactory { @Override public Searchable search() { return new StarPic(); } }
package com.factory.abstractFactory; public class AnimationPicFactory implements SearchFactory{ @Override public Searchable search() { return new AnimationPic(); } }
定義新聞搜索的三個功能: 測試
package com.factory.abstractFactory; public class CultureNews implements Searchable{ @Override public void get() { System.out.println("文化新聞搜索"); } }
package com.factory.abstractFactory; public class TechNews implements Searchable { @Override public void get() { System.out.println("科技新聞搜索"); } }
package com.factory.abstractFactory; public class EconomicNews implements Searchable{ @Override public void get() { System.out.println("經濟新聞搜索"); } }
package com.factory.abstractFactory; public class CultureNewsFactory implements SearchFactory { @Override public Searchable search() { return new CultureNews(); } }
package com.factory.abstractFactory; public class TechNewsFactory implements SearchFactory { @Override public Searchable search() { return new TechNews(); } }
package com.factory.abstractFactory; public class EconomicNewsFactory implements SearchFactory { @Override public 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接口,同時建立一個產品工廠便可,還能夠進行產品之間功能的耦合。抽象工廠模式能夠適用於一個系統獨立於產品的建立組合和表示,或者只想提供一個產品類庫的接口,不想提供實現的時候。 spa