Factory 方法模式是對簡單原廠模式的改進。首先看看簡單原廠模式的缺點。
軟體是之所以區別於程式,是因為它可以被人們使用,並能間接創造效益。需求是軟體開發的核心,忽視使用者的需求,軟體本身就沒有存在的價值。
假如Nokia又新開發了一款新手機N99,對於採用簡單原廠模式設計的系統,我們的做法是:
1.新增一個CN99類繼承自CNokia抽象類別,這個符合OCP原則。
註:OCP:Open-Closed Principle開閉原則。OCP關注的是靈活性,改動是通過增加代碼進行的,而不是改動現有的代碼。對擴充開放,對修改關閉。
2.修改靜態Factory 方法中的判斷邏輯,增加對N99的建立代碼。這個明顯違背OCP。
改進簡單原廠模式,我們要做的就是克服2中的缺點。
下面的Factory 方法模式,新增一個N96的工廠類,不用修改已有的代碼,完全支援OCP原則,而且Factory 方法模式也完全遵守裡氏替換原則,LSP原則是OCP成為可能的重要原則。
註:Liskov Substitution Principle(裡氏代換原則):子類型(subtype)必須能夠替換它們的基底類型。
雖然Factory 方法模式是對簡單原廠模式缺點的該進,這個缺點就是違背軟體設計原則OCP。但是並不是Factory 方法模式就優於簡單原廠模式,只不過後者更符合常規的軟體設計理念。
/* 抽象工廠類 */<br />#pragma once<br />#include "Nokia.h"<br />class CFactoryMethod<br />{<br />public:<br />CFactoryMethod(void);<br />public:<br />virtual ~CFactoryMethod(void);<br />public:<br />virtual CNokia * CreateNokiaMobile(void) = 0;<br />};</p><p>#include "FactoryMethod.h"</p><p>CFactoryMethod::CFactoryMethod(void)<br />{<br />}</p><p>CFactoryMethod::~CFactoryMethod(void)<br />{<br />}</p><p>/* 生產N99的具體工廠類 */<br />#pragma once<br />#include "factorymethod.h"<br />#include "N96.h"<br />class CN96Factory :<br />public CFactoryMethod<br />{<br />public:<br />CN96Factory(void);<br />public:<br />virtual ~CN96Factory(void);<br />public:<br />virtual CNokia * CreateNokiaMobile(void);<br />};</p><p>#include "N96Factory.h"</p><p>CN96Factory::CN96Factory(void)<br />{<br />}</p><p>CN96Factory::~CN96Factory(void)<br />{<br />}</p><p>CNokia * CN96Factory::CreateNokiaMobile(void)<br />{<br />return new CN96();<br />}</p><p>/* 用戶端通過建立N99工廠生產Nokia手機 */<br />#include "stdafx.h"<br />#include "N96Factory.h"<br />int _tmain(int argc, _TCHAR* argv[])<br />{<br />CFactoryMethod * factoryMethod = new CN96Factory();<br />CNokia * nokia = factoryMethod->CreateNokiaMobile();<br />nokia->MakeCall("1234567");<br />return 0;<br />}