日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式学习-工厂方法模式

發布時間:2023/12/13 asp.net 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式学习-工厂方法模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

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


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

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

View Code?abstract?class?HandleFactory
????{
????????public?abstract?BankCardHandle?CreateBankCardHandle();

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

View 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實例。

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

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

????class?UnionPayCardHandleFactory?:?HandleFactory
????{
????????public?override?BankCardHandle?CreateBankCardHandle()
????????{
????????????return?new?UnionPayCardHandle();
????????}
客戶端調用代碼如下: View Code? HandleFactory?hd?=?new?UnionPayCardHandleFactory();
????????????BankCardHandle?bk?=?hd.CreateBankCardHandle();
我們以后增加卡處理方式,只需要增加相應的卡處理類和生成卡處理類的工廠,然后修改一下客戶端代碼就好了,如果連客戶端代碼都不想修改,在客戶端獲取配置文件,用反射處理就OK了。

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

總結

以上是生活随笔為你收集整理的设计模式学习-工厂方法模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。