【設(shè)計模式(一)】簡單工廠——計算器用例
2019-07-29 00:13 作者:HarrickHeng | 我要投稿

溫故而知新,工作半年來最大的感觸就是知識儲備的不足與基礎(chǔ)知識的薄弱,特此復習一下23種設(shè)計模式,并用一些典型的應用場景來模擬該種模式的使用。
暫時使用的語言是微軟的Typescript,與C#、JAVA等語言在某些地方會有一些出入。
簡單工廠(Simple Factory)
首先它不屬于23種設(shè)計模式,但之后的抽象工廠、工廠方法模式都由此演化而來,而且在工廠創(chuàng)建類比較少的情況下也會使用,因此算是設(shè)計模式中的”父類“了。
廢話不多說,先上需求:做一個簡單的計算器(加減乘除)。
類圖

?
Operation 運算類
class Operation {
? ?private _numberA: number;
? ?private _numberB: number;
? ?constructor(){
? ?}
? ? get numberA(): number
? ?{
? ? ? ?return this._numberA;
? ?}
? ? set numberA(num: number)
? ?{
? ? ? ?this._numberA = num;
? ?}
? ? get numberB(): number
? ?{
? ? ? ?return this._numberB;
? ?}
? ? set numberB(num: number)
? ?{
? ? ? ?this._numberB = num;
? ?}
? ?
? ?/**
? ? * 得到結(jié)果
? ? */
? ?public GetResult(): number
? ?{
? ? ? ?let result: number = 0;
? ? ? ?return result;
? ?}
}
OperationAdd、OperationSub、OperationMul、OperationDiv 加減乘除類
(繼承于運算類)
/**加類**/
class OperationAdd extends Operation {
? ?constructor() {
? ? ? ?super(); ? ? ?
? ?}
? ?public GetResult(): number
? ?{
? ? ? ?super.GetResult();
? ? ? ?let result: number = 0;
? ? ? ?result = this.numberA + this.numberB;
? ? ? ?return result;
? ?}
}
/**減類**/
class OperationSub extends Operation {
? ?
? ?constructor() {
? ? ? ?super(); ? ? ?
? ?}
? ?public GetResult(): number
? ?{
? ? ? ?super.GetResult();
? ? ? ?let result: number = 0;
? ? ? ?result = this.numberA - this.numberB;
? ? ? ?return result;
? ?}
}
/**乘類**/
class OperationMul extends Operation {
? ?
? ?constructor() {
? ? ? ?super(); ? ? ?
? ?}
? ?public GetResult(): number
? ?{
? ? ? ?super.GetResult();
? ? ? ?let result: number = 0;
? ? ? ?result = this.numberA * this.numberB;
? ? ? ?return result;
? ?}
}
/**除類**/
class OperationDiv extends Operation {
? ?
? ?constructor() {
? ? ? ?super(); ? ? ?
? ?}
? ?public GetResult(): number
? ?{
? ? ? ?super.GetResult();
? ? ? ?let result: number = 0;
? ? ? ?if (this.numberB == 0)
? ? ? ? ? ?throw (new Error("除數(shù)不能為0!"));
? ? ? ?result = this.numberA / this.numberB;
? ? ? ?return result;
? ?}
}
OperationFactory 簡單運算工廠類(將以上類通過不同條件實例化)
class OperationFactory {
? ?constructor() {
? ?}
? ?public static createOperate (operate: string): Operation {
? ? ? ?let oper: Operation = null;
? ? ? ?switch(operate) {
? ? ? ? ? ?case "+":
? ? ? ? ? ? ? ?oper = new OperationAdd();
? ? ? ? ? ? ? ?break;
? ? ? ? ? ?case "-":
? ? ? ? ? ? ? ?oper = new OperationSub();
? ? ? ? ? ? ? ?break;
? ? ? ? ? ?case "*":
? ? ? ? ? ? ? ?oper = new OperationMul();
? ? ? ? ? ? ? ?break;
? ? ? ? ? ?case "/":
? ? ? ? ? ? ? ?oper = new OperationDiv();
? ? ? ? ? ? ? ?break;
? ? ? ?}
? ? ? ?return oper;
? ?}
}
客戶端測試
let oper: Operation;
oper = OperationFactory.createOperate("/"); //輸入條件,生產(chǎn)除類的實例
oper.numberA = 5; //輸入數(shù)字A
oper.numberB = 0; //輸入數(shù)字B
let res: number = oper.GetResult(); //得出運算結(jié)果
console.log(oper.numberA,oper.numberB,res); //報錯:除數(shù)不能為0!
優(yōu)缺點
優(yōu)點:只需要傳入一個正確的參數(shù),就可以獲取所需要的對象而無須知道其創(chuàng)建細節(jié)。
缺點:工廠類的職責相對過重,增加新的產(chǎn)品需要修改工廠類的判斷邏輯,違背開閉原則。

標簽: