愛伊米

【設計模式】1-簡單工廠模式

請用C++,java,C#等任意一種面嚮物件語言實現一個計算機控制檯程式,要求輸入的兩個數和運算子號,得到結果。

你看到題目,覺得這道題不難,沒一會就寫好了,如下

version_1。cpp

其實上面的程式碼有幾個問題。

命名a b c d 很不規範

判斷分支的寫法,寫了4個if,意味著每個條件都要做判斷,相當於計算機做了3次無用功

如果除數為0則將程式異常。雖然C++程式碼裡會輸出inf,但是相對於應用場景來說是有問題的。

針對以上的問題,進行修改,結果如下:

version_2。cpp

改到實現計算器是沒有問題的,但是有沒有寫出讓人滿意的程式碼呢?

現在我讓你寫一個window程式的計算器,要有圖形介面的,是不是說我下面這段程式碼要再寫一遍呢?

還是說你打算直接複製過去?

題目說要用面向物件的語言寫出計算器的程式。

面向物件,封裝,我們把這段程式碼封裝成類,實現程式碼的複用。

version_3。cpp

這樣,我們就把計算方法封裝好了,實現了程式碼的複用。

現在,來了一個新需求,要加一個 開根號(sqrt) 的運算,你要怎麼改?

只要修改 Calc 類就行了,加一個 if 判斷。

這樣可行,

但是

有一個問題,你現在要加一個開根號的運算,卻要 加減乘除 的運算都參與編譯,如果你大意了,把加法寫做除法,那涼涼。

所以引出了我們今天所學的簡單工廠模式,

其實就是如何去例項化物件的問題

針對不同的的運算子生成不同的運算類物件,利用C++的多型呼叫子類的函式進行運算。

如果需要加一個 開根號的運算,實現一個 開根號的運算類,在工廠類中增加一個判斷就好了,就不會改到原來的運算類的實現,也不用原有的運算類參與到編譯的過程,避免了出錯。

version_4。cpp

最後複習一下C++多型的三個必要條件:

是一個指標

父類指標指向子類物件

呼叫虛擬函式

你學會了嗎?自己實現一遍吧,會有收穫的。