就是圍繞一個超級工廠創建其他工廠,個人的理解就是工廠模式多了幾個維度
使用範圍:系統的產品超過一個產品族,而系統只消費某一族的產品
例子:服裝會有商務裝,時尚裝;商務裝下面也會有一系列的產品分類 每次我們只是取其中的一件衣服
一:爲形狀創建一個接口
shape.java
public interface Shape { void draw(); }二:對應的實現shape接口的實體類(多個)
Rectangle.java
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } }
三:爲顏色創建另一個接口類
Color.java
public interface Color { void fill(); }四:對應的實現color接口的實體類(多個)
public class Red implements Color { @Override public void fill() { System.out.println("Inside Red::fill() method."); } }五:爲color和shape創建抽象類來獲取工廠
AbstractFactory.java
public abstract class AbstractFactory { abstract Color getColor(String color); abstract Shape getShape(String shape) ; }六:繼承幣實現,創建擴展了AbstractFactory的工廠類,機與給定信息生成實體類的對象,對應的只實現自己工廠類的方法
ShapeFactory.java
public class ShapeFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ if(shapeType == null){ return null; } if(shapeType.equalsIgnoreCase("CIRCLE")){ return new Circle(); } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new Rectangle(); } else if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; } @Override Color getColor(String color) { return null; } }七:創建一個工廠創造器,用來判定使用那個對應的工廠類
FactoryProducer.java
public class FactoryProducer { public static AbstractFactory getFactory(String choice){ if(choice.equalsIgnoreCase("SHAPE")){ return new ShapeFactory(); } else if(choice.equalsIgnoreCase("COLOR")){ return new ColorFactory(); } return null; } }
八:使用 FactoryProducer 來獲取 AbstractFactory,通過傳遞類型信息來獲取實體類的對象
AbstractFactoryPatternDemo.java
public class AbstractFactoryPatternDemo { public static void main(String[] args) { //獲取形狀工廠 AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE"); //獲取形狀爲 Circle 的對象 Shape shape1 = shapeFactory.getShape("CIRCLE"); //調用 Circle 的 draw 方法 shape1.draw(); //獲取形狀爲 Rectangle 的對象 Shape shape2 = shapeFactory.getShape("RECTANGLE"); //調用 Rectangle 的 draw 方法 shape2.draw(); //獲取形狀爲 Square 的對象 Shape shape3 = shapeFactory.getShape("SQUARE"); //調用 Square 的 draw 方法 shape3.draw(); //獲取顏色工廠 AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR"); //獲取顏色爲 Red 的對象 Color color1 = colorFactory.getColor("RED"); //調用 Red 的 fill 方法 color1.fill(); //獲取顏色爲 Green 的對象 Color color2 = colorFactory.getColor("Green"); //調用 Green 的 fill 方法 color2.fill(); //獲取顏色爲 Blue 的對象 Color color3 = colorFactory.getColor("BLUE"); //調用 Blue 的 fill 方法 color3.fill(); } }