設計模式學習-工廠方法模式

  在上文(設計模式學習-簡單工廠模式)的模擬場景中,我們用簡單工廠模式實現了VISA和MASTERARD卡的刷卡處理,系統成功上線并運行良好,突然有一天老大跑來說,我們的系統需要升級,提供對一般銀聯卡的支持。怎么辦?有需求總是要改的,苦B的程序員傷不起啊....

  怎么改?增加一個銀聯卡處理類?然后在工廠類的靜態方法里增加Case處理?前幾天剛讀了面向對象的核心設計原則-“開放封閉原則”,這樣改下去不是完全違背了這個設計原則?
?

  開放封閉原則(OCP,Open?Closed?Principle)是所有面向對象原則的核心。軟件設計本身所追求的目標就是封裝變化、降低耦合,而開放封閉原則正是對這一目標的最直接體現。其他的設計原則,很多時候是為實現這一目標服務的,例如以Liskov替換原則實現最佳的、正確的繼承層次,就能保證不會違反開放封閉原則。開放封閉原則,其核心的思想是:軟件實體應該是可擴展,而不可修改的。也就是說,對擴展是開放的,而對修改是封閉的


于是,我決定重構之前的簡單工廠模式實現的方法,首先我們找出變化點,增加銀聯卡處理類是不可避免,這屬于擴展,對工廠類增加CASE條件的處理,這里屬于修改原業務,屬于修改,OCP告訴我們,對修改應該是關閉的。

  OK,順利找到變化點,由于我們不知道將來需要實例化出什么對象,所以將產品工廠抽象出來,讓對象的實例化在子類實現:

ExpandedBlockStart.gifView Code?
abstract?class?HandleFactory
????{
????????public?abstract?BankCardHandle?CreateBankCardHandle();

  接著,我們實現生成VISA及MASTERARD刷卡對象的實際工廠:

ExpandedBlockStart.gifView Code?
class?VisaHandleFactory?:?HandleFactory?
????{
????????public?override?BankCardHandle?CreateBankCardHandle()
????????{
????????????return?new?VisaHandle();
????????}
????}

????class?MasterCardHandleFactory?:?HandleFactory
????{
????????public?override?BankCardHandle?CreateBankCardHandle()
????????{
????????????return?new?MasterCardHandle();
????????}
BankCardHandle、VisaHandle、MasterCardHandle類見上一篇(設計模式學習-簡單工廠模式)。

  不知不覺,我們用工廠方法模式重構了我們的系統,下面我們看看工廠方法模式的介紹。

模式概述:

工廠方法模式又稱工廠模式,屬于類的創建型模式。在工廠方法模式中,父類負責定義創建對象的公共接口,而子類則負責生成具體的對象,這樣做的目的是將類的實例化操作延遲到子類中完成,即由子類決定究竟應該實例化哪一個類。
UML類圖:


其中的類或對象之間的關系為:

  • 產品角色(Product)
    定義產品的相關接口。

  • 真實的的產品角色(ConcreteProduct)
    實現接口Product。

  • 工廠角色(Factory)
    聲明工廠方法(FactoryMethod),返回一個產品(Product)。

  • 真實的工廠(ConcreteFactory)
    實現FactoryMethod工廠方法,由客戶調用,返回一個Product實例。

  經過上面我們用工廠方法模式重構刷卡系統后,老大提出的增加一個銀聯卡的處理就比較好辦了,先增加一個銀聯卡處理類,同時增加一個生產銀聯卡處理類的工廠類:

ExpandedBlockStart.gifView Code?
class?UnionPayCardHandle?:?BankCardHandle
????{
????????public?override?void?HandleProcess()
????????{
????????????Console.WriteLine("銀聯卡處理中");
????????}
????}

????class?UnionPayCardHandleFactory?:?HandleFactory
????{
????????public?override?BankCardHandle?CreateBankCardHandle()
????????{
????????????return?new?UnionPayCardHandle();
????????}

客戶端調用代碼如下:
ExpandedBlockStart.gifView Code?
HandleFactory?hd?=?new?UnionPayCardHandleFactory();
????????????BankCardHandle?bk?=?hd.CreateBankCardHandle();

我們以后增加卡處理方式,只需要增加相應的卡處理類和生成卡處理類的工廠,然后修改一下客戶端代碼就好了,如果連客戶端代碼都不想修改,在客戶端獲取配置文件,用反射處理就OK了。

轉載于:https://www.cnblogs.com/kdalan/archive/2012/06/01/2531395.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260761.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260761.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260761.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3ds Max Shortcuts 快捷鍵大全

主界面 【Q】選擇循環改變方式 【W】移動 【E】旋轉 【R】縮放循環改變方式 【7】物體面數 【8】Environment 【9】Advanced lighting 【0】Render to Textures 【1】【2】【3】【4】【5】分別對應5個次物體級別,例如Edit Mesh中的點、線、面、多邊形、 【F2】切換在…

word2010激活工具使用方法

1、關閉殺毒,關閉正打開著的word文檔 2、執行Activator_v1.2.exe-->Activation Office 2010VL --》按1 --》完畢。 3、打開word--》文件--》幫助--》看右上角。 2、【補充】使用 Office 2010 Toolkit 下載地址: http://vdisk.weibo.com/s/yoz9R 或…

python編程單詞排序_Python實現對文件進行單詞劃分并去重排序操作示例

本文實例講述了Python實現對文件進行單詞劃分并去重排序操作。分享給大家供大家參考,具體如下: 文件名:test1.txt 文件內容: But soft what light through yonder window breaks It is the east and Juliet is the sun Arise fair…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波17 - 銳化高通濾波器 - 梯度圖像(羅伯特,Sobel算子)

目錄銳化(高通)空間濾波器使用一階導數銳化圖像-梯度銳化(高通)空間濾波器 平滑通過稱為低通濾波類似于積分運算銳化通常稱為高通濾波微分運算高過(負責細節的)高頻,衰減或抑制低頻…

如何學習Linux / 新手入門

如何學習Linux / 新手入門 一、從基礎開始:常常有些朋友在Linux論壇問一些問題,不過,其中大多數的問題都是很基礎的。例如:為什么我使用一個命令的時候,系統告訴我找不到該目錄,我要如何限制使用者的權限等…

opacity用法:

/* older safari/Chrome browsers */ -webkit-opacity: 0.5; /* Netscape and Older than Firefox 0.9 */ -moz-opacity: 0.5; /* Safari 1.x (pre WebKit!) 老式khtml內核的Safari瀏覽器*/ -khtml-opacity: 0.5; /* IE9 etc...modern browsers */ opacity: .5; /* IE…

網絡傳輸層之TCP、UDP詳解

1、傳輸層存在的必要性 由于網絡層的分組傳輸是不可靠的,無法了解數據到達終點的時間,無法了解數據未達終點的狀態。因此有必要增強網絡層提供服務的服務質量。 2、引入傳輸層的原因 面向連接的傳輸服務與面向連接的網絡服務類似,都分為建立連…

關機與禁止關機代碼

今天抽空,寫完了定時關機程序的代碼,測試了一下,還不錯,以前寫過個禁止關機的程序,用來測試一下,看哪個強,先運行禁止關機的程序,用Windows xp的關閉計算機試了一下,關不了. 代碼很少: private procedure QueryEndSession(var Msg:TMessage);Message WM_QueryEndSession;…

pythonweb開發面試_Python web 面試題(一)

1、列舉django的內置組件? url 、view、model、template、中間件 2、列舉django中間件的5個方法?以及django中間件的應用場景? process_request(self,request) process_view(self, request, callback, callback_args, callback_kwargs) proce…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波18 - 低通、高通、帶阻和帶通濾波器、組合使用空間增強方法

低通、高通、帶阻和帶通濾波器 得到空間濾波器的第三種方法,生成一維濾波器函數,然后要么使用式(3.42)wvvTw vv^TwvvT生成二維可分離的濾波器函數,要么旋轉這些一維函數來生成二維核。旋轉后的一維函數是圓對稱(各向同性&#x…

MySQL兩千萬數據優化遷移

最近有一張2000W條記錄的數據表需要優化和遷移。2000W數據對于MySQL來說很尷尬,因為合理的創建索引速度還是挺快的,再怎么優化速度也得不到多大提升。不過這些數據有大量的冗余字段和錯誤信息,極不方便做統計和分析。所以我需要創建一張新表&…

Linux Tomcat 6.0安裝配置實踐總結

系統環境: Red Hat Enterprise Linux Server release 5.7 (Tikanga) 64位 Tomcat下載 從官方網站 http://tomcat.apache.org/下載你需要的Tomcat版本,目前Tomcat主要版本有Tomcat 6.0、Tomcat 7.0、Tomcat 8.0三個版本,下面我們以6.0(6.0.39…

如何給FormPanel表單中的元素賦值以及獲取表單元素值

1.定義表單元素的name屬性如下 var HLV new Ext.form.TextField({fieldLabel: 匯率,name:EXCHANGERATE,anchor: 30%}); 2.定義數據源 var ExchangeRatestore new Ext.data.Store({proxy: new Ext.data.HttpProxy({ url: WsECOTAX01.asmx/SelectExchangeRate, method: "po…

第4章 Python 數字圖像處理(DIP) - 頻率域濾波1 - 傅里葉級數和變換簡史

本章主要講解頻域域濾波的技術,主要技術用到是大家熟悉的傅里葉變換與傅里葉反變換。這里有比較多的篇幅講解的傅里葉的推導進程,用到Numpy傅里葉變換。本章理論基礎比較多,需要更多的耐心來閱讀,有發現有錯誤,可以與我…

python中str是什么函數_python str函數怎么用

展開全部 是將一個2113對象轉成字符串顯示5261,注意只是顯示用,有些對象4102轉成字符串沒有直1653接的意思。 str():將變量轉化為字符串類型 a 1 b [1, 2, 3] str_a str(a) print(a) print(type(a)) str_b str(b) print(b) print(type(b)) The str()…

[ofbiz]less-than (lt;) and greater-than (gt;) symbols

問題描述&#xff1a; In field [updateItemStr] less-than (<) and greater-than (>) symbols are not allowed 此處的field [updateItemStr]是services的一個IN參數&#xff0c;錯誤描述的意思是"<,>"不能出現在這個域內。 解決辦法&#xff1a; 在ser…

分頁探究--Filter+JSTL

最近卡了一個功能就是分頁&#xff0c;查了很多資料&#xff0c;分頁大概是兩種類型&#xff1a;一種是把數據庫的東西全部查出來然后放在session里&#xff0c;用list一頁一頁傳到頁面&#xff0c;這樣的消耗比較大;另一種就是使用sql語句的limit來進行數據庫分頁查詢。我使用…

iPhone開發資料之內存管理 ,循環引用導致的內存問題

iPhone開發資料之內存管理 ,循環引用導致的內存問題 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447 http://en.wikipedia.org/wiki/Reference_counting 【IT168 技術文檔】開…

python能做大型游戲嗎_python有做大型游戲的潛力嗎?

著作權歸作者所有。商業轉載請聯系作者獲得授權&#xff0c;非商業轉載請注明出處。 豈止是有潛力&#xff0c;簡直是很合適&#xff01; 豬廠兩大游戲客戶端引擎&#xff0c;NeoX 和 Messiah&#xff0c;都使用 Python 作為腳本語言。 你最近所了解的比較火的掛著豬廠旗號的&a…

第4章 Python 數字圖像處理(DIP) - 頻率域濾波2 - 復數、傅里葉級數、連續單變量函數的傅里葉變換、卷積

目錄基本概念復數傅里葉級數沖激函數及其取樣&#xff08;篩選&#xff09;性質連續單變量函數的傅里葉變換卷積基本概念 復數 復數CCC的定義為 CRjI(4.3)C R jI \tag{4.3}CRjI(4.3) R,IR,IR,I為實數&#xff0c;RRR是實部&#xff0c;III是虛部&#xff0c;j?1j \sqrt{-…