設計模式:學習筆記(6)——抽象工廠模式
設計模式:學習筆記(6)——抽象工廠模式
快速開始
介紹
抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創建其他工廠。該超級工廠又稱為其他工廠的工廠。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
在抽象工廠模式中,接口是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。
工廠模式中,一個工廠只能只能創建一類產品。而在實際過程中,一個工廠往往需要生產多類產品,為了解決這個問題,我們引入了抽象工廠模式。
模式原理
UML圖
各部分組成:
形象表示:
實例分析
實例類圖
我們將創建 Shape
AbstractFactoryPatternDemo,我們的演示類使用 FactoryProducer 來獲取 AbstractFactory 對象。它將向 AbstractFactory 傳遞形狀信息 Shape(CIRCLE / RECTANGLE / SQUARE),以便獲取它所需對象的類型。同時它還向 AbstractFactory
步驟 1
為形狀創建一個接口。
Shape.java
public interface Shape { void draw(); }
步驟 2
創建實現接口的實體類。
Rectangle.java
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } }
Square.java
public class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); } }
Circle.java
public class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); } }
步驟 3
為顏色創建一個接口。
Color.java
public interface Color { void fill(); }
步驟4
創建實現接口的實體類。
Red.java
public class Red implements Color { @Override public void fill() { System.out.println("Inside Red::fill() method."); } }
Green.java
public class Green implements Color { @Override public void fill() { System.out.println("Inside Green::fill() method."); } }
Blue.java
public class Blue implements Color { @Override public void fill() { System.out.println("Inside Blue::fill() method."); } }
步驟 5
為 Color 和 Shape 對象創建抽象類來獲取工廠。
AbstractFactory.java
public abstract class AbstractFactory { abstract Color getColor(String color); abstract Shape getShape(String shape) ; }
步驟 6
創建擴展了 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; } }
ColorFactory.java
public class ColorFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ return null; } @Override Color getColor(String color) { if(color == null){ return null; } if(color.equalsIgnoreCase("RED")){ return new Red(); } else if(color.equalsIgnoreCase("GREEN")){ return new Green(); } else if(color.equalsIgnoreCase("BLUE")){ return new Blue(); } return null; } }
步驟 7
創建一個工廠創造器/生成器類,通過傳遞形狀或顏色信息來獲取工廠。
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; } }
步驟 8
使用 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(); } }
步驟 9
驗證輸出。
Inside Circle::draw() method. Inside Rectangle::draw() method. Inside Square::draw() method. Inside Red::fill() method. Inside Green::fill() method. Inside Blue::fill() method.
設計模式:學習筆記(6)——抽象工廠模式