1. 程式人生 > 其它 >【設計模式】工廠模式—簡單工廠模式

【設計模式】工廠模式—簡單工廠模式

技術標籤:設計模式設計模式java

簡單工廠模式(Factory Method Pattern)

簡單工廠模式是屬於建立型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠物件決定創建出哪一種產品類的例項。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現。

組成

工廠(Creator)角色是簡單工廠模式的核心,它負責實現建立所有例項的內部邏輯。工廠類的建立產品類的方法可以被外界直接呼叫,建立所需的產品物件。

抽象產品(Product)角色是簡單工廠模式所建立的所有物件的父類,它負責描述所有例項所共有的公共介面。

具體產品(Concrete Product)角色是簡單工廠模式的建立目標,所有建立的物件都是充當這個角色的某個具體類的例項。

UML類圖

«abstract» Operation -double numberA -double numberB +setNumberA(double a) +getNumberA() : double +setNumberB(double b) +getNumberB() : double +getResult() : double
OperationAdd +getResult() : double OperationSub +getResult() : double OperationMul +getResult() : double OperationDiv +getResult() : double OperationFactory +createOperation() Inheritance Inheritance Inheritance
Inheritance Association

示例程式碼

OperationFactory.java

import java.util.Scanner;

public class OperationFactory {
    public static Operation createOperate(String c) throws Exception {
        Operation opr = null;
        switch(c) {
            case "+": opr = new OperationAdd();break;
            case "-": opr = new OperationSub();break;
            case "*": opr = new OperationMul();break;
            case "/": opr = new OperationDiv();break;
            default:
                throw new Exception("運算子輸入錯誤");
        }
        return opr;
    }
}

abstract class Operation {
    private double NumberA;
    private double NumberB;
    public void setNumberA(double a) {
        NumberA = a;
    }
    public double getNumberA() {
        return NumberA;
    }
    public void setNumberB(double b) {
        NumberB = b;
    }
    public double getNumberB() {
        return NumberB;
    }
    public abstract double getResult() throws Exception;
}

class OperationAdd extends Operation {
    @Override
    public double getResult() {
        return getNumberA() + getNumberB();
    }
}

class OperationSub extends Operation {
    @Override
    public double getResult() {
        return getNumberA() - getNumberB();
    }
}

class OperationMul extends Operation {
    @Override
    public double getResult() {
        return getNumberA() * getNumberB();
    }
}

class OperationDiv extends Operation {
    @Override
    public double getResult() throws Exception {
        if(getNumberB() == 0)
            throw new Exception("除數不能為0");
        return getNumberA() / getNumberB();
    }
}

Main.java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner s = new Scanner(System.in);
        Operation ans;
        System.out.println("請輸入數字A:");
        double numberA = s.nextDouble();
        System.out.println("請輸入運算子(+,-,*,/):");
        ans = OperationFactory.createOperate(s.next());
        System.out.println("請輸入數字B:");
        double numberB = s.nextDouble();
        ans.setNumberA(numberA);
        ans.setNumberB(numberB);
        System.out.println("結果:" + ans.getResult());
        s.close();
    }
}

缺點

由於工廠類集中了所有例項的建立邏輯,違反了高內聚責任分配原則,將全部建立邏輯集中到了一個工廠類中;它所能建立的類只能是事先考慮到的,如果需要新增新的類,則就需要改變工廠類了。

當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件建立不同例項的需求.這種對條件的判斷和對具體產品型別的判斷交錯在一起,很難避免模組功能的蔓延,對系統的維護和擴充套件非常不利;

這些缺點在工廠方法模式中得到了一定的克服。

適用場景

工廠類負責建立的物件比較少;

客戶只知道傳入工廠類的引數,對於如何建立物件(邏輯)不關心;