Design Pattern

Chapter 3 抽象工廠模式

抽象工廠模式(Abstract Factory Pattern)屬於『創建型模式』。

定義:

提供一個創建一系列相關或相互依賴的對象接口,無須指定他們具體類。

組成:

  1. 抽象工廠(AbstractFactory):包含所以的產品建立的抽象方法
  2. 具體工廠(ConcreteFactory):具體工廠
  3. 抽象產品(AbstractProduct):都有多種不同的實現
  4. 具體產品(Product):為抽象產品的具體實現

UML (資料來源:維基百科)

程式碼

Step1

public interface Shape {
    public void draw();
}

Step2

public class Circle implements Shape{
    @Override
    public void draw() {
        System.out.println("畫一個圓形");
    }
}


public class Square implements Shape{
    @Override
    public void draw() {
        System.out.println("畫一個正方形");
    }
}

Step3

public interface Color {    
    public void fill();
}

Step4

public class Red implements Color{
    @Override
    public void fill() {
        System.out.println("塗上紅色");
    }
}


public class White implements Color{
    @Override
    public void fill() {

        System.out.println("塗上白色");
    }
}

Step5

public abstract class AbstractFactory {
    abstract Color getColor(String color);
    abstract Shape getShape(String shape);
}

Step6

public class ShapeFactory extends AbstractFactory{
    @Override
    Color getColor(String color) {
        return null;
    }

    @Override
    Shape getShape(String shapeType) {
        if(shapeType == null){
             return null;
          }        
          if(shapeType.equalsIgnoreCase("CIRCLE")){
             return new Circle();
          }else if(shapeType.equalsIgnoreCase("SQUARE")){
             return new Square();
          }
          return null;
    }
}


public class ColorFactory extends AbstractFactory{
    @Override
    Color getColor(String color) {
        if(color == null){
             return null;
          }        
          if(color.equalsIgnoreCase("RED")){
             return new Red();
          }else if(color.equalsIgnoreCase("WHITE")){
             return new White();
          }
        return null;
    }

    @Override
    Shape getShape(String shape) {
        return null;
    }
}

Step7

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;
    }
}

Step8

public static void main(String[] args) {
    AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
    Shape shape1 = shapeFactory.getShape("CIRCLE");
    shape1.draw();

    Shape shape3 = shapeFactory.getShape("SQUARE");
    shape3.draw();

    AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
    Color color1 = colorFactory.getColor("RED");
    color1.fill();

    Color color2 = colorFactory.getColor("WHITE");
    color2.fill();
}

Step9(Output)

畫一個圓形
畫一個正方形
塗上紅色
塗上白色

優點:

  1. 抽象工廠模式可以實現高內聚低耦合的設計目的,因此抽象工廠模式被廣泛的應用。
  2. 當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終使用同一個產品族中的對象。
  3. 增加新的具體工廠和產品族很方便,不需要修改已有的系統,符合“開閉原則”。

缺點:

  1. 在產品族中擴充功能新的產品是很困難的,它需要修改抽象工廠的介面。
  2. 增加新的工廠和產品族容易,增加新的產品等級結構麻煩(開閉原則的傾斜性)。