抽象工廠模式:提供一個創建一系列的相關的或者依賴的對象的接口,無需指定它們的具體實現類,具體的時間分別在子類工廠中產生。
類似于工廠模式:隔離了具體類的生產實現,使得替換具體的工廠實現類很容易。包含有以下模塊:
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 {@Overridepublic void gotowork() {System.out.println("騎自行車去上班!");}}
?
package factory.simple;/*** @author lilin* */ public class Bus implements Car {@Overridepublic void gotowork() {System.out.println("坐公交車去上班!");}}
?
/*** */ package factory.abstractfactory;/*** @author lilin* */ public class Milk implements IBreakFast {@Overridepublic void eat() {System.out.println("喝牛奶!");}}
?
/*** */ package factory.abstractfactory;/*** @author lilin* */ public class Orange implements IBreakFast {@Overridepublic 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 {@Overridepublic Car getCar() {return new Bike();}@Overridepublic IBreakFast getBreakFast() {return new Orange();}}
?
/*** */ package factory.abstractfactory;import factory.simple.Bus; import factory.simple.Car;/*** @author lilin* */ public class HighPersonFactory implements IAbstractFactory {@Overridepublic Car getCar() {return new Bus();}@Overridepublic IBreakFast getBreakFast() {return new Milk();} }
?
最后,通過testNG簡單測試下,抽象工廠模式的實現:代碼如下:
/*** */ package factory.abstractfactory;import org.testng.annotations.Test;import factory.simple.Car;/*** @author lilin* */ public class AbstractFactoryTest {@Testpublic 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();}}
這樣使用過程城中,只要注入抽象的工廠接口,具體的產品的產生,會在實際的子類工廠類中產生,也可以隨意的添加和修改實際子類工廠類,而不需要改變既有的代碼設計。
抽象工廠方法:一般常常使用于一套程序,需要多套實現的場景之下。
?