簡(jiǎn)單工廠模式懒棉,又叫做靜態(tài)工廠方法(Static Factory Method)模式,但不屬于23種 GOF 設(shè)計(jì)模式之一竟痰。簡(jiǎn)單工廠模式是由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類(lèi)的實(shí)例盘榨。簡(jiǎn)單工廠模式是工廠模式家族中最簡(jiǎn)單實(shí)用的模式,可以理解為是不同工廠模式的一個(gè)特殊實(shí)現(xiàn)澡腾。
簡(jiǎn)單工廠模式中的角色:
- Factory:工廠類(lèi)沸伏,簡(jiǎn)單工廠模式的核心,負(fù)責(zé)實(shí)現(xiàn)所實(shí)例的內(nèi)部邏輯动分。工廠類(lèi)的創(chuàng)建產(chǎn)品類(lèi)的方法可以被外界直接調(diào)用毅糟,創(chuàng)建所需的產(chǎn)品對(duì)象。
- IProduct:抽象產(chǎn)品類(lèi)澜公,簡(jiǎn)單工廠所創(chuàng)建的所有對(duì)象的父類(lèi)姆另,負(fù)責(zé)描述所有實(shí)例的共有的公共接口。
- Product:具體產(chǎn)品類(lèi)坟乾,這是簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo)迹辐。
簡(jiǎn)單工廠模式的簡(jiǎn)單實(shí)現(xiàn)
(1) 抽象產(chǎn)品類(lèi),其中抽象方法用于返回運(yùn)算結(jié)果甚侣。
public abstract class Operation {
private double x;
private double y;
public void setX(double x) {
this.x = x;
}
public void setY(double y) {
this.y = y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public abstract double getResult() throws Exception;
}
(2) 具體產(chǎn)品類(lèi)
繼承 Operation明吩,并實(shí)現(xiàn)其 getResult 方法,返回計(jì)算結(jié)果殷费。
加法類(lèi)
public class OperationAdd extends Operation {
@Override
public double getResult() {
return getX() + getY();
}
}
減法類(lèi)
public class OperationSub extends Operation {
@Override
public double getResult() {
return getX() - getY();
}
}
乘法類(lèi)
public class OperationMul extends Operation {
@Override
public double getResult() {
return getX() * getY();
}
}
除法類(lèi)
public class OperationDiv extends Operation {
@Override
public double getResult() {
double x = getX();
double y = getY();
if (y == 0) {
throw new ArithmeticException("除數(shù)不能為0");
}
return x / y;
}
}
(3) 工廠類(lèi)
創(chuàng)建一個(gè)工廠類(lèi)印荔,提供一個(gè)靜態(tài)方法 createOperate 用來(lái)生成計(jì)算器低葫。
public class OperationFactory {
public static Operation createOperate(String operate) {
Operation operation = null;
switch (operate) {
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
}
return operation;
}
}
(4) 客戶(hù)端調(diào)用工廠類(lèi)
public class Calculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("輸入運(yùn)算符:");
String operation = scanner.next();
Operation operate = OperationFactory.createOperate(operation);
System.out.print("輸入第一個(gè)數(shù)字:");
operate.setX(scanner.nextDouble());
System.out.print("輸入第二個(gè)數(shù)字:");
operate.setY(scanner.nextDouble());
try {
System.out.print("結(jié)果:" + operate.getResult());
} catch (Exception e) {
e.printStackTrace();
}
}
}
簡(jiǎn)單工廠模式的使用場(chǎng)景
使用場(chǎng)景:
工廠類(lèi)負(fù)責(zé)創(chuàng)建的對(duì)象比較少。
客戶(hù)只需知道傳入工廠類(lèi)的參數(shù)仍律,而無(wú)須關(guān)心對(duì)象的邏輯嘿悬。
簡(jiǎn)單工廠模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):使用戶(hù)根據(jù)參數(shù)獲得對(duì)應(yīng)的類(lèi)實(shí)例,避免了直接實(shí)例化類(lèi)水泉,減低了耦合度善涨。
缺點(diǎn):可實(shí)例化的類(lèi)型在編譯期間郵件已經(jīng)被確定。如果增加新類(lèi)型草则,則需要修改工廠钢拧,這違背了開(kāi)發(fā)封閉原則。簡(jiǎn)單工廠需要知道要生成的類(lèi)型炕横,其當(dāng)子類(lèi)過(guò)多或者子類(lèi)層次過(guò)多時(shí)不適合使用娶靡。