簡單工廠模式又稱靜態(tài)工廠模式腕铸,是創(chuàng)建型模式
定義
簡單工廠模式的實質(zhì)是由一個工廠類根據(jù)傳入的參數(shù)实辑,動態(tài)決定應該創(chuàng)建哪一個產(chǎn)品類(這些產(chǎn)品類繼承自一個父類或接口)的實例不从。(摘自百度百科)
角色
- 工廠:工廠類擁有一個抽象產(chǎn)品類的引用以及一個創(chuàng)建產(chǎn)品類的工廠方法浊洞,根據(jù)客戶端傳入的參數(shù)生產(chǎn)不同的產(chǎn)品
- 抽象產(chǎn)品(即工廠中抽象類):是所有產(chǎn)品的父類
- 具體產(chǎn)品類:繼承抽象產(chǎn)品類牵敷。
UML類圖
簡單工廠模式UML類圖
代碼
- Operation.java
public abstract class Operation {
public Long numberA;
public Long numberB;
public abstract long getResult();
}
- AddOperation.java
public class AddOperation extends Operation {
@Override
public long getResult() {
return numberA + numberB;
}
}
- SubOperation.java
public class SubOperation extends Operation {
@Override
public long getResult() {
return numberA - numberB;
}
}
- MulOperation.java
public class MulOperation extends Operation {
@Override
public long getResult() {
return numberA * numberB;
}
}
- DivOperation.java
public class DivOperation extends Operation {
@Override
public long getResult() {
if(numberB == 0){
throw new RuntimeException("除數(shù)不能為零");
}
return numberA/numberB;
}
}
- SimpleFactory.java
public static Operation create(String operation){
Operation op = null;
switch (operation){
case "+":
op = new AddOperation();
break;
case "-":
op = new SubOperation();
break;
case "*":
op = new MulOperation();
break;
case "/":
op = new DivOperation();
break;
default:
break;
}
return op;
}
}
- ClientTest.java
public class ClientTest {
public static void main(String[] args) {
Operation operation = SimpleFactory.create("+");
operation.numberA = 10L;
operation.numberB = 20L;
long result = operation.getResult();
System.out.println(result);
}
}
優(yōu)點
工廠類是關(guān)鍵,負責產(chǎn)品的生產(chǎn)(即對象的創(chuàng)建)法希,客戶端只要傳入相應的參數(shù)就能得到相應的產(chǎn)品枷餐,而不要管產(chǎn)品是如何創(chuàng)建的。
缺點
所有產(chǎn)品的創(chuàng)建都是由工廠類進行創(chuàng)建的苫亦,只能創(chuàng)建事先考慮到的產(chǎn)品毛肋,如果要新加產(chǎn)品的話,就需要的改動工廠類
使用場景
- 工廠類負責創(chuàng)建的對象比較少
- 客戶端不關(guān)心產(chǎn)品的生產(chǎn)過程屋剑,只要傳入相應的參數(shù)得到產(chǎn)品
- 由于簡單工廠很容易違反高內(nèi)聚責任分配原則润匙,因此一般只在很簡單的情況下使用
利用反射機制來改進簡單工廠模式
因為現(xiàn)有的簡單工廠模式每次新加一個產(chǎn)品,都要新建一個產(chǎn)品類以及在工廠類中加上一個switch唉匾,顯得有些繁瑣孕讳,所以就用反射來改進
改進后的工廠和客戶端的代碼如下
- UseReflectSimpleFactory.java
public class UseReflectSimpleFactory {
public static Operation create(Class<? extends Operation> clazz){
Operation operation = null;
try {
operation = clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return operation;
}
}
- UseReflectClientTest.java
public class UseReflectClientTest {
public static void main(String[] args) {
Operation operation =
UseReflectSimpleFactory.create(DivOperation.class);
operation.numberA = 100L;
operation.numberB = 10L;
System.out.println(operation.getResult());
}
}
改進的工廠方法傳一個Class對象,而不是一個產(chǎn)品類的路徑的原因是避免客戶端寫錯了路徑而導致實例化產(chǎn)品失敗的情況
------------------------------------END-------------------------------------------