簡單工廠模式(靜態工廠)
認識
在工廠類中提高一個工廠方法,根據參數類型實例化不同的對象返回給客戶端
思考
定義:提供一個創建對象實例的功能,無須關心細節和具體實現。
面向接口編程,只知道接口,不知道實現類
本質是:選擇實現
使用場景
- 當需要封裝實現細節,外部不知道具體實現只能通過接口來操作封裝體的時候,可以選擇簡單工廠,讓客戶端通過簡單工廠提供的方法獲取相應的接口實現。
- 當想要把創建對象的職責、權限集中在內部管理和控制時,選擇簡單工廠,例如簡單工廠加單例模式控制創建對象。
優缺點
優點
- 封裝實現細節
- 解耦
缺點
- 增加客戶端複雜度
- 不方便擴展子工廠
UML圖
客戶端只能夠訪問接口和工廠類,具體實現細節對客戶端透明,工廠方法一般都是靜態的,根據客戶端調用傳入的參數去實例化不同的實現類對象。
代碼實現
在工廠方法中也可以通過讀取外部配置文件中的class name進行反射創建對象,實現可配置。例如將數據庫驅動的class 配置在外部properties中,在工廠方法中讀取到驅動類反射創建,之後想更改驅動的時候直接更改配置文件即可。
/**
* 靜態工廠
*/
public class Factory {
public static IOperate createClass(String regix){
IOperate operate =null;
char myRegix = regix.charAt(0);
switch(myRegix){
case '+' :
operate = new Add();
break;
case '-' :
operate = new Sub();
break;
case '*' :
operate = new Mul();
break;
case '/' :
operate = new Div();
break;
default :
throw new RuntimeException("你輸出的運算符不符合該計算器");
}
return operate;
}
public Factory() {
}
}
/**
* 接口
*
*/
public interface IOperate {
public double firstNum = 0;
public double secondNum = 0;
public double getResult(double firstNum,double secondNum);
}
/**
*實現類
*/
class Add implements IOperate{
public double getResult(double firstNum, double secondNum) {
double result = firstNum + secondNum;
return result;
}
}
class Sub implements IOperate{
public double getResult(double firstNum, double secondNum) {
double result = firstNum - secondNum;
return result;
}
}
class Mul implements IOperate{
public double getResult(double firstNum, double secondNum) {
double result = firstNum * secondNum;
return result;
}
}
class Div implements IOperate{
public double getResult(double firstNum, double secondNum) {
if(secondNum == 0){
throw new RuntimeException("被除數不能爲0");
}
double result = firstNum / secondNum;
return result;
}
}