抽象工廠模式:提供一個創建一系列的相關的或者依賴的對象的接口,無需指定它們的具體實現類,具體的時間分別在子類工廠中產生。
類似於工廠模式:隔離了具體類的生產實現,使得替換具體的工廠實現類很容易。包含有以下模塊:
1.抽象產品接口:定義產品的接口,公共的暴露方法。便於實際的產品類實現。
2.具體的產品類:包含實際產品的類的邏輯處理:
3.抽象工廠接口:定義產生系列對象的接口
4.具體的工廠實現:實現抽象的接口工廠,返回具體的產品類的實現。
下面是具體的代碼示例:
1.抽象的產品接口,定義了Car 和 IBreakFast
package factory.simple; /** * 抽象產品角色 交通工具接口 * * @author lilin * */ public interface Car { /** * 上班函數 */ void gotowork(); }
package factory.abstractfactory; /** * @author lilin * */ public interface IBreakFast { /** * 吃早餐 */ void eat(); }
2.定義具體的產品類的實現:
package factory.simple; /** * 具體產品角色,自行車 * * @author lilin * */ public class Bike implements Car { @Override public void gotowork() { System.out.println("騎自行車去上班!"); } }
package factory.simple; /** * @author lilin * */ public class Bus implements Car { @Override public void gotowork() { System.out.println("坐公交車去上班!"); } }
/** * */ package factory.abstractfactory; /** * @author lilin * */ public class Milk implements IBreakFast { @Override public void eat() { System.out.println("喝牛奶!"); } }
/** * */ package factory.abstractfactory; /** * @author lilin * */ public class Orange implements IBreakFast { @Override public void eat() { System.out.println("吃橘子!"); } }
3.定義好抽象的工廠接口,一系列的獲取實例的接口方法:
/** * */ package factory.abstractfactory; import factory.simple.Car; /** * @author lilin * */ public interface IAbstractFactory { /** * * @return */ Car getCar(); /** * */ IBreakFast getBreakFast(); }
4.定義具體的工廠生產類,具體的產品實例返回。
/** * */ package factory.abstractfactory; import factory.simple.Bike; import factory.simple.Car; /** * @author lilin * */ public class LowPersonFactory implements IAbstractFactory { @Override public Car getCar() { return new Bike(); } @Override public IBreakFast getBreakFast() { return new Orange(); } }
/** * */ package factory.abstractfactory; import factory.simple.Bus; import factory.simple.Car; /** * @author lilin * */ public class HighPersonFactory implements IAbstractFactory { @Override public Car getCar() { return new Bus(); } @Override public IBreakFast getBreakFast() { return new Milk(); } }
最后,通過testNG簡單測試下,抽象工廠模式的實現:代碼如下:
/** * */ package factory.abstractfactory; import org.testng.annotations.Test; import factory.simple.Car; /** * @author lilin * */ public class AbstractFactoryTest { @Test public void test() { IAbstractFactory factory = new LowPersonFactory(); Car car = factory.getCar(); IBreakFast breakFast = factory.getBreakFast(); System.out.println("吃的早飯是:"); breakFast.eat(); System.out.println("上班交通工具是:"); car.gotowork(); IAbstractFactory factory2 = new HighPersonFactory(); car = factory2.getCar(); breakFast = factory2.getBreakFast(); System.out.println("吃的早飯是:"); breakFast.eat(); System.out.println("上班交通工具是:"); car.gotowork(); } }
這樣使用過程城中,只要注入抽象的工廠接口,具體的產品的產生,會在實際的子類工廠類中產生,也可以隨意的添加和修改實際子類工廠類,而不需要改變既有的代碼設計。
抽象工廠方法:一般常常使用於一套程序,需要多套實現的場景之下。
