大話設計模式之簡單工廠模式
阿新 • • 發佈:2018-12-18
該部落格主要參考內容如下:
什麼是簡單工廠模式
簡單工廠模式(Simple Factory Pattern):又稱為靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式。在簡單工廠模式中,可以根據引數的不同返回不同類的例項。簡單工廠模式專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。說白了:就是建立物件的
簡單工廠模式的組成
工廠類(Factory):簡單工廠模式的核心,用來建立物件。
抽象產品類(Product):它一般是具體產品要繼承的父類或者要實現的介面。
具體產品角色(ConcreteProduct):工廠類所建立的物件就是此角色的例項
如何使用簡單工廠模式
假如有這樣一個需求:寫一個計算器 實現 + - x /,你怎麼做
第一段程式碼
/** * 一.問自己 * 1.這樣的程式,維護,擴充套件,複用性,靈活性 怎麼樣,是不是很差 * 2.這樣寫相當於寫死了,是不是,如果需求有變動,重新寫一次?不可能,對不對 * 二.怎麼辦,想一下 * 1.首先想到 面向物件:封裝,繼承,多型,來提高:維護,擴充套件,複用性,靈活性 * 2.利用封裝,將邏輯層面與控制層面分開 * 三.看第二層程式碼 * * */ public class Test { public static void main(String[] args) { System.out.print("輸入數字A:"); Scanner scan =new Scanner(System.in); String numberA = scan.nextLine(); System.out.println("輸入運算子 + - x /:"); Scanner operator =new Scanner(System.in); String operatorSelect = scan.nextLine(); System.out.println("輸入數字B:"); Scanner scanB =new Scanner(System.in); String numberB = scan.nextLine(); String result=""; double parseDouble =00d; switch (operatorSelect) { case "+": parseDouble=Double.parseDouble(numberA)+Double.parseDouble(numberB); System.out.println(parseDouble); break; case "-": parseDouble=Double.parseDouble(numberA)-Double.parseDouble(numberB); System.out.println(parseDouble); break; case "x": parseDouble=Double.parseDouble(numberA)*Double.parseDouble(numberB); System.out.println(parseDouble); break; case "/": if (!numberB.equals("0")) { parseDouble=Double.parseDouble(numberA)/Double.parseDouble(numberB); System.out.println(parseDouble); }else { result="除數不能為0"; System.out.println(result); } break; default: System.out.println("運算子輸入有誤"); break; } } }
第二部分
public class Test1 { /*** * 一.看了第二層程式碼,問自己 * 1.這樣實現了我們說的問題了嗎,她只是把邏輯層面封裝起來了,是不是 * 2.如果我們要加一個開根運算呢,在邏輯層面加一個case 語句,是這樣嗎,如果是這樣,就不要看往下看了 * 3.增加一個運算型別,萬一你增加case語句,修改了其他其他case語句的內容,其他case 語句是別人寫的,你改了,會不會揍你, * 別說你不會,小心駛得萬年船 * 二。怎麼辦,想一下 * 1.既然不能在一個類裡,這樣容易影響其他運算型別,那就分開來,每種方法都寫一個類,這樣就不會影響了吧 * 2.看第三層程式碼 * * */ public static void main(String[] args) { // 第一個數字 System.out.print("輸入數字A:"); Scanner scan =new Scanner(System.in); String numberA = scan.nextLine(); double numberAa = Double.parseDouble(numberA); // 運算子 System.out.println("輸入運算子 + - x /:"); Scanner operator =new Scanner(System.in); String operatorSelect = scan.nextLine(); // 第二個數字 System.out.println("輸入數字B:"); Scanner scanB =new Scanner(System.in); String numberB = scan.nextLine(); double numberBb = Double.parseDouble(numberB); // 呼叫封裝的方法 Operation.getResult(numberAa, operatorSelect, numberBb); } }
public class Operation {
public static void getResult(Double numberAa,String opera,Double numberBb) {
String errorResult="除數不能為0";
double result =00d;
switch (opera) {
case "+":
result=numberAa+numberBb;
System.out.println(result);
break;
case "-":
result=numberAa-numberBb;
System.out.println(result);
break;
case "x":
result=numberAa*numberBb;
System.out.println(result);
break;
case "/":
if (numberBb!=0) {
result=numberAa/numberBb;
System.out.println(result);
}else {
System.out.println(errorResult);
}
break;
default:
System.out.println("運算子輸入有誤");
break;
}
}
}
第三部分
/**
* 基類 加 減 成 除 的共性
* */
public class OperationA {
private Double numberA;
private Double numberB;
public Double getNumberA() {
return numberA;
}
public void setNumberA(Double numberA) {
this.numberA = numberA;
}
public Double getNumberB() {
return numberB;
}
public void setNumberB(Double numberB) {
this.numberB = numberB;
}
public double result(Double numberA,Double numberB){
double result=0;
return result;
}
}
加法
public class Add extends OperationA{
public double result(Double numberA,Double numberB){
double result=0;
result=numberA+numberB;
System.out.println(result);
return result;
}
}
減法
public class Sub extends OperationA{
public double result(Double numberA,Double numberB){
double result=0;
result=numberA-numberB;
System.out.println(result);
return result;
}
}
乘法
public class Mul extends OperationA{
public double result(Double numberA,Double numberB){
double result=0;
result=numberA*numberB;
System.out.println(result);
return result;
}
}
除法
public class Div extends OperationA{
public double result(Double numberA,Double numberB){
double result=0;
if (numberB!=0) {
result=numberA/numberB;
System.out.println(result);
}else {
System.out.println("除數不能為0");
}
return result;
}
}
工廠
public class OperationFactory {
public static OperationA getOperation(String opera) {
OperationA operationA=null;
switch (opera) {
case "+":
operationA=new Add();
break;
case "-":
operationA=new Sub();
break;
case "X":
operationA=new Mul();
break;
case "/":
operationA=new Div();
break;
case "%":
operationA=new yushu();
break;
default:
System.out.println("運算子輸入有誤");
}
return operationA;
}
}
呼叫
public class Test3 {
/**
* 一。看第三層程式碼有,問自己
* 1.這層程式碼都幹嘛了,有沒有實現:維護,擴充套件,複用性,靈活性
* 2.分析:2.1每種運算都有自己獨立的類,需要那種用那種,具有靈活性,複用性也強
* 2.2 擴充套件:當需要一個其他方法時(求餘數),增加對應的類,並且在工廠裡新增該類即可
* 2.3:維護:如果要修改加法,只需要在add 類做修改,而不是一個 什麼都有的類裡修改,不會修改其他運算的核心演算法,便於維護
* 二,這就是簡單工廠模式
* */
public static void main(String[] args) {
//1. + - x / 的基類
OperationA operation=null;
//2. 根據不同的運算獲得不同的物件(工廠模式)
operation = OperationFactory.getOperation("+");
double result = operation.result(3.1, 2.2);
System.out.println(result);
}
}