一(1)簡單工廠模式
阿新 • • 發佈:2017-09-25
ner log factory auto 過多 測試 extend 耦合度 工廠
1 設計模式中經常用到程序設計中的封裝,繼承,多態的思想。不同的設計模式使代碼更加靈活,容易擴展。
2 設計模式中一般都會存在父類的概念,父類一般是抽象類,內部維護的變量,用於子類繼承;維護的抽象方法,用於子類去具體實現。
3 對於一個方案的模式設計,要首先抽象出父類,想出父類中要維護哪些子類都要用到的變量;維護哪些子類都要去實現的方法。
擴展性的體現:主要體現在多態的實現部分,比如增加新的需求,要求可以計算a的b次冪,不需要動加減乘除的具體實現代碼(類),只需要增加新類,去實現冪運算,在工廠類中,增加一個case語句即可。
解耦合的體現:不同的加減乘除具體實現方法通過不同的類來實現,這樣它們之間基本沒關聯,實現解耦合。
本例子應用簡單工廠的設計模式,返回不同的加減乘除運算類的對象。
package com.biao.factory.simplefactory; /* *0 簡單工廠類:根據傳遞的不同參數,通過多態,創建不同的對象,進行不同的運算操作。 *1 可擴展:比如增加新的開方運算,只需要增加一個具體的運算類OperationSqur即可,不用更改原有代碼,此為可擴展。 *2 封裝:比如不同的具體的運算類對於加減乘除的不同方法進行了封裝,這樣使加減乘除運算之間的耦合度降低。 *3 繼承:父類中定義變量,以及方法;子類去繼承父類,用父類的變量,重寫父類的方法,實現具體的運算。 *4 多態:簡單工廠類中,通過傳遞的不同參數,去創建不同的對象*/ public class SimpleFactoryDemo { public static void main(String[] args) { Operation operation = null; /*測試1*/ operation = OperationFactory.createOperation("+"); operation.numberA = 5; operation.numberB = 10; Double result = operation.getResult(); System.out.println("result:"+result); /*測試2*/ operation = OperationFactory.createOperation("/"); operation.numberA = 15; operation.numberB = 3; Double result2 = operation.getResult(); System.out.println("result:"+result2); } } /** * 1 內部維護兩個操作數,用於進行運算 * 2 內部維護一個返回結果的方法,用於子類重寫,並返回子類特有的結果。 * 3 這是一個父類。父類主要定義有哪些東西,具體如何操作,需要各個子類去實現。 */ class Operation{ public double numberA = 0; public double numberB = 0; 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 getResult(){ double result = 0d; return result; } } /** * 1 以下為具體的運算類,即加減乘除類。 */ class OperationAdd extends Operation{ public double getResult(){ double result = 0d; result = numberA + numberB; return result; } } class OperationSub extends Operation{ public double getResult(){ double result = 0d; result = numberA - numberB; return result; } } class OperationMul extends Operation{ public double getResult(){ double result = 0d; result = numberA * numberB; return result; } } class OperationDiv extends Operation{ public double getResult(){ double result = 0d; if(numberB == 0){ try { throw new Exception("除數為0"); } catch (Exception e) { e.printStackTrace(); } }else{ result = numberA/numberB; } return result; } } /** * 1 以下為運算符工廠類,通過多態,生成不同的運算類。 * */ class OperationFactory{ public static Operation createOperation(String operate){ Operation oper = null; switch (operate) { case "+": oper = new OperationAdd(); break; case "-": oper = new OperationSub(); break; case "*": oper = new OperationMul(); break; case "/": oper = new OperationDiv(); break; default: break; } return oper; } }
如上demo的改進,改進運算操作的父類為一個抽象類,抽象類中維護兩個操作數,用於進行計算,維護一個方法,用於返回計算結果。
代碼如下:
package com.biao.factory.simplefactory.again; /** * @改進:運算類更改為抽象類,抽象類中維護兩個變量,(就是操作數,用於進行運算),還有一個抽象方法, * 用於子類繼承重寫,返回不同的運算結果。 */ public class SimpleFactoryDemo { public static void main(String[] args) { Operation oper; /*測試1*/ oper = OperationFactory.createOperation("+"); oper.NumberA = 1; oper.NumberB = 6; System.out.println(oper.getResult()); /*測試2*/ oper = OperationFactory.createOperation("/"); oper.NumberA = 42; oper.NumberB = 6; System.out.println(oper.getResult()); } } /*此類進行了改進*/ abstract class Operation{ public double NumberA; public double NumberB; public abstract double getResult(); } /*具體運算類*/ class OpetationAdd extends Operation{ @Override public double getResult() { // TODO Auto-generated method stub return NumberA + NumberB; } } class OpetationSub extends Operation{ @Override public double getResult() { // TODO Auto-generated method stub return NumberA - NumberB; } } class OpetationMul extends Operation{ @Override public double getResult() { // TODO Auto-generated method stub return NumberA * NumberB; } } class OpetationDiv extends Operation{ @Override public double getResult() { // TODO Auto-generated method stub double result =0; if(NumberB == 0){ try { throw new Exception("除數為0"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ result = NumberA/NumberB; } return result; } } /*運算工廠生成類*/ class OperationFactory{ public static Operation createOperation(String operate){ Operation oper = null; switch (operate) { case "+": oper = new OpetationAdd(); break; case "-": oper = new OpetationSub(); break; case "*": oper = new OpetationMul(); break; case "/": oper = new OpetationDiv(); break; default: break; } return oper; } }
一(1)簡單工廠模式