【設計模式】工廠模式—簡單工廠模式
阿新 • • 發佈:2021-01-25
簡單工廠模式(Factory Method Pattern)
簡單工廠模式是屬於建立型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠物件決定創建出哪一種產品類的例項。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現。
組成
工廠(Creator)角色是簡單工廠模式的核心,它負責實現建立所有例項的內部邏輯。工廠類的建立產品類的方法可以被外界直接呼叫,建立所需的產品物件。
抽象產品(Product)角色是簡單工廠模式所建立的所有物件的父類,它負責描述所有例項所共有的公共介面。
具體產品(Concrete Product)角色是簡單工廠模式的建立目標,所有建立的物件都是充當這個角色的某個具體類的例項。
UML類圖
示例程式碼
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();
}
}
缺點
由於工廠類集中了所有例項的建立邏輯,違反了高內聚責任分配原則,將全部建立邏輯集中到了一個工廠類中;它所能建立的類只能是事先考慮到的,如果需要新增新的類,則就需要改變工廠類了。
當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件建立不同例項的需求.這種對條件的判斷和對具體產品型別的判斷交錯在一起,很難避免模組功能的蔓延,對系統的維護和擴充套件非常不利;
這些缺點在工廠方法模式中得到了一定的克服。
適用場景
工廠類負責建立的物件比較少;
客戶只知道傳入工廠類的引數,對於如何建立物件(邏輯)不關心;