簡(jiǎn)單工廠模式
? 前面也學(xué)了很多各種微服務(wù)架構(gòu)的組件,包括后續(xù)的服務(wù)部署、代碼管理、Docker等技術(shù),那么作為后端人員,最重要的任務(wù)還是代碼編寫能力,如何讓你的代碼寫的漂亮、易擴(kuò)展,讓別人一看賞心悅目,那么設(shè)計(jì)模式就是很重的了。那么本本篇文章就來(lái)聊聊一個(gè)簡(jiǎn)單的工廠模式。
緣起
? 一個(gè)22歲剛畢業(yè)的大學(xué)生A,計(jì)算機(jī)專業(yè)學(xué)的Java語(yǔ)言,到B公司面試。而面試題非常簡(jiǎn)單,實(shí)現(xiàn)一個(gè)簡(jiǎn)易計(jì)算器的功能,A覺(jué)得面試題很簡(jiǎn)單,三下五除二直接10分鐘完事兒了。然而交卷后,遲遲等不到B公司的通知,多半是涼了,那么他是怎么實(shí)現(xiàn)的呢?代碼如下:
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請(qǐng)輸入數(shù)字A:");
String A = sc.nextLine();
System.out.println("請(qǐng)選擇運(yùn)算符(+、-、*、/):");
String B = sc.nextLine();
System.out.println("請(qǐng)輸入數(shù)字B:");
String C = sc.nextLine();
double D = 0d;
if (B.equals("+")) D = Double.parseDouble(A) + Double.parseDouble(C);
if (B.equals("-")) D = Double.parseDouble(A) - Double.parseDouble(C);
if (B.equals("*")) D = Double.parseDouble(A) * Double.parseDouble(C);
if (B.equals("/")) D = Double.parseDouble(A) / Double.parseDouble(C);
System.out.println("結(jié)果是:" + D);
}
}
那么就以上的代碼,按功能來(lái)說(shuō),有問(wèn)題嗎?
沒(méi)問(wèn)題,功能確實(shí)實(shí)現(xiàn)了;但是細(xì)看就會(huì)發(fā)現(xiàn)代碼規(guī)范及其他的問(wèn)題:
- 變量名命名問(wèn)題:ABCD?
- if判斷問(wèn)題,假如輸入的是
+
號(hào),那么其他的判斷還有必要再去執(zhí)行嗎,沒(méi)必要 - 輸入的不是數(shù)字時(shí)怎么處理
那么按照上面的問(wèn)題,依次去改動(dòng)代碼
public class Test {
public static void main(String[] args) {
try {
Scanner sc = new Scanner(System.in);
System.out.println("請(qǐng)輸入數(shù)字A:");
double numberA = Double.parseDouble(sc.nextLine());
System.out.println("請(qǐng)選擇運(yùn)算符(+、-、*、/):");
String strOperate = sc.nextLine();
System.out.println("請(qǐng)輸入數(shù)字B:");
double numberB = Double.parseDouble(sc.nextLine());
double result = 0d;
switch (strOperate) {
case "+":
result = numberA + numberB;
break;
case "-":
result = numberA - numberB;
break;
case "*":
result = numberA * numberB;
break;
case "/":
result = numberA / numberB;
break;
}
System.out.println("結(jié)果是:" + result);
} catch (Exception e) {
System.out.println("您的輸入有誤:" + e.getMessage());
}
}
}
行了,代碼規(guī)范的問(wèn)題是都已經(jīng)完善了。
那么如何提高代碼的可維護(hù)、可擴(kuò)展、可復(fù)用、靈活性更好呢?
答案就是面向?qū)ο蟆?/p>
業(yè)務(wù)的封裝
準(zhǔn)確的說(shuō),就是讓業(yè)務(wù)邏輯和界面邏輯分開(kāi),讓它們之間的耦合度下降,只有分離開(kāi),才可以達(dá)到容易維護(hù)和擴(kuò)展。
增加一個(gè)運(yùn)算類
public class Operation {
public static double getResult(double numberA, double numberB, String operate) {
double result = 0d;
switch (operate) {
case "+":
result = numberA + numberB;
break;
case "-":
result = numberA - numberB;
break;
case "*":
result = numberA * numberB;
break;
case "/":
result = numberA / numberB;
break;
}
return result;
}
}
那么客戶端Test的代碼
public class Test {
public static void main(String[] args) {
try {
Scanner sc = new Scanner(System.in);
System.out.println("請(qǐng)輸入數(shù)字A:");
double numberA = Double.parseDouble(sc.nextLine());
System.out.println("請(qǐng)選擇運(yùn)算符(+、-、*、/):");
String strOperate = sc.nextLine();
System.out.println("請(qǐng)輸入數(shù)字B:");
double numberB = Double.parseDouble(sc.nextLine());
double result = Operation.getResult(numberA, numberB, strOperate);
System.out.println("結(jié)果是:" + result);
} catch (Exception e) {
System.out.println("您的輸入有誤:" + e.getMessage());
}
}
}
業(yè)務(wù)邏輯和界面邏輯都分離開(kāi)了,那么這種方案就是面向?qū)ο蟮姆庋b,三大特性之一。
增加功能
計(jì)算器的功能發(fā)生改變了,不僅要支持+-*/
,我還想要加一個(gè)平方根運(yùn)算,那我們就需要去修改Operation
類中的代碼
public class Operation {
public static double getResult(double numberA, double numberB, String operate) {
double result = 0d;
switch (operate) {
case "+":
result = numberA + numberB;
break;
case "-":
result = numberA - numberB;
break;
case "*":
result = numberA * numberB;
break;
case "/":
result = numberA / numberB;
break;
case "pow":
result = Math.pow(numberA, numberB);
break;
}
return result;
}
}
那么問(wèn)題來(lái)了,我這里是加了一個(gè)pow的case分支,加一個(gè)平方根運(yùn)算的功能,但是卻需要讓加減乘除的運(yùn)算全都得來(lái)參與編譯,萬(wàn)一一個(gè)不小心,把加法運(yùn)算改成減法了,又沒(méi)有注意到,直接給上生產(chǎn)環(huán)境了,這之后造成的問(wèn)題能承擔(dān)的了嗎?
那么我們?yōu)榱嗽黾庸δ?,而不讓其他已?jīng)存在的功能有代碼誤改的風(fēng)險(xiǎn)。繼續(xù)對(duì)業(yè)務(wù)方法進(jìn)行改進(jìn).
我們將Operation類置為抽象類,讓其他的加減乘除繼承它,并且每一個(gè)功能都是一個(gè)單獨(dú)的類實(shí)現(xiàn)自己的業(yè)務(wù)邏輯
public abstract class Operation {
public double getResult(double numberA, double numberB) {
return 0d;
}
}
加減乘除類
public class Add extends Operation { // 加
@Override
public double getResult(double numberA, double numberB) {
return numberA + numberB;
}
}
public class Sub extends Operation { // 減
@Override
public double getResult(double numberA, double numberB) {
return numberA - numberB;
}
}
public class Mul extends Operation { // 乘
@Override
public double getResult(double numberA, double numberB) {
return numberA * numberB;
}
}
public class Div extends Operation { // 除
@Override
public double getResult(double numberA, double numberB) {
if (numberB == 0) {
System.out.println("除數(shù)不能為0");
throw new RuntimeException();
}
return numberA / numberB;
}
}
實(shí)現(xiàn)簡(jiǎn)單工廠
上面抽象出來(lái)一個(gè)操作類(Operation),并且有加減乘除的業(yè)務(wù)邏輯類,那么我如何得知,應(yīng)該用哪個(gè)業(yè)務(wù)邏輯類呢?
這時(shí)候,我們就需要一個(gè)工廠類,工廠顧名思義就是用來(lái)加工的,我把原料放進(jìn)去,工廠給我生產(chǎn)出來(lái)產(chǎn)品。
public class OperationFactory {
public static Operation createOperate(String operate) {
Operation oper = null;
switch (operate) {
case "+":
oper = new Add();
break;
case "-":
oper = new Sub();
break;
case "*":
oper = new Mul();
break;
case "/":
oper = new Div();
break;
}
return oper;
}
}
客戶端這里調(diào)用時(shí)
public class Test {
public static void main(String[] args) {
try {
Scanner sc = new Scanner(System.in);
System.out.println("請(qǐng)輸入數(shù)字A:");
double numberA = Double.parseDouble(sc.nextLine());
System.out.println("請(qǐng)選擇運(yùn)算符(+、-、*、/):");
String strOperate = sc.nextLine();
System.out.println("請(qǐng)輸入數(shù)字B:");
double numberB = Double.parseDouble(sc.nextLine());
Operation operate = OperationFactory.createOperate(strOperate);
double result = operate.getResult(numberA, numberB);
System.out.println("結(jié)果是:" + result);
} catch (Exception e) {
System.out.println("您的輸入有誤:" + e.getMessage());
}
}
}
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-722729.html
上面就是大致的結(jié)構(gòu)圖,當(dāng)我們?cè)俅卧黾有碌墓δ軙r(shí),只需要去集成Operation運(yùn)算類,然后實(shí)現(xiàn)自己的業(yè)務(wù)邏輯就可以了,看起來(lái)是不是比原先的一坨代碼更加一目了然了,并且也提高了它的復(fù)用性、維護(hù)性、擴(kuò)展性,也更加靈活了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-722729.html
到了這里,關(guān)于聊聊設(shè)計(jì)模式--簡(jiǎn)單工廠模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!