角色:
抽象工廠角色:擔任這個角色是模式的核心,他應該是與應用商業系統無關的。通常是Java接口或Java抽象類,其他的具體工廠類必須實現這個Java接口或繼承這個Java抽象類。
具體工廠角色:這個角色直接在客戶端的調用下創建產品的實例,這個角色含有選擇合適的產品對象的邏輯,而這個邏輯是與應用系統商業邏輯緊密相關的。
抽象產品角色:這個角色是工廠模式所創建的對象的父類,或他們共同的接口。
具體產品角色:抽象工廠模式所創建的任何產品對象都是某一個具體產品類的實例。這是客戶端最終需要的東西,其內部充滿了商業邏輯。
類結構圖:
水果抽象接口:
package com.design.abstractfactory; public interface Fruit { void fruitInfo(); }
蔬菜抽象接口:
package com.design.abstractfactory; public interface Vegetable { void vegetableInfo(); }
工廠抽象接口:
package com.design.abstractfactory; public interface Factory { Fruit createFruit(); Vegetable createVegetable(); }
具體類:北方水果
package com.design.abstractfactory; public class NorthFruit implements Fruit { @Override public void fruitInfo() { System.out.println("North-Apple"); } }
具體類:南方水果
package com.design.abstractfactory; public class SouthFruit implements Fruit { @Override public void fruitInfo() { System.out.println("South-Banana"); } }
具體類:北方蔬菜
package com.design.abstractfactory; public class NorthVegetable implements Vegetable { @Override public void vegetableInfo() { System.out.println("North-Tomato"); } }
具體類:南方蔬菜
package com.design.abstractfactory; public class SouthVegetable implements Vegetable { @Override public void vegetableInfo() { System.out.println("South-Taro"); } }
具體類:北方產品工廠
package com.design.abstractfactory; public class NorthProductFactory implements Factory { @Override public Fruit createFruit() { return new NorthFruit(); } @Override public Vegetable createVegetable() { return new NorthVegetable(); } }
具體類:南方產品工廠
package com.design.abstractfactory; public class SouthProductFactory implements Factory { @Override public Fruit createFruit() { return new SouthFruit(); } @Override public Vegetable createVegetable() { return new SouthVegetable(); } }
測試類:
package com.design.abstractfactory; public class Client { public static void main(String[] args){ Factory northFactory = new NorthProductFactory(); Factory southFactory = new SouthProductFactory(); System.out.println("北方產品:"); northFactory.createFruit().fruitInfo(); northFactory.createVegetable().vegetableInfo(); System.out.println("南方產品:"); southFactory.createFruit().fruitInfo(); southFactory.createVegetable().vegetableInfo(); } }
輸出:

