亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

詳解C#的設計模式編程之抽象工廠模式的應用

2020-01-24 01:16:27
字體:
來源:轉載
供稿:網友

這里首先以一個生活中抽象工廠的例子來實現一個抽象工廠,然后再給出抽象工廠的定義和UML圖來幫助大家更好地掌握抽象工廠模式,同時大家在理解的時候,可以對照抽象工廠生活中例子的實現和它的定義來加深抽象工廠的UML圖理解。抽象工廠模式比其它工廠模式更加抽象,抽象工廠模式適用與多個抽象類的情況下,通過工廠返回多個抽象類中你需要得到的具體子類實例。

抽象工廠模式比其它工廠模式更加抽象,抽象工廠模式適用與多個抽象類的情況下,通過工廠返回多個抽象類中你需要得到的具體子類實例。

舉例闡述抽象工廠模式:
假如中國對邪惡國家開戰。

中國裝備:炸彈類,坦克類,來消滅邪惡國家。

炸彈類:導彈,核彈;

坦克類:越野車,主站坦克;

戰略:

前期中國兵工廠生產:導彈,越野車,打擊邪惡國家。

后期中國兵工廠生產:核彈,主站坦克,毀滅邪惡國家。

類圖:

2016217144844885.png (1091×595)

裝備類代碼:

  #region 炸彈系列  abstract class Bomb  {    abstract public void baozha();  }  /// <summary>  /// 導彈  /// </summary>  class daodanBomb :Bomb  {    public override void baozha()    {      Console.WriteLine("我是一顆中國造導彈,來轟炸不老實的小邪惡國家!");    }  }  /// <summary>  /// 核彈  /// </summary>  class hedanBomb : Bomb  {    public override void baozha()    {      Console.WriteLine("我是一顆中國造核彈,來轟炸不老實的小邪惡國家!");    }  }  #endregion  #region 坦克系列  abstract class Tank  {    abstract public void go();  }  /// <summary>  /// 越野車  /// </summary>  class yueyeTank : Tank  {    public override void go()    {      Console.WriteLine("我是一顆中國造越野車,來踏平不老實的小邪惡國家!");    }  }  /// <summary>  /// 主站坦克  /// </summary>  class zhuzhanTank : Tank  {    public override void go()    {      Console.WriteLine("我是一顆中國造主站坦克,來踏平不老實的小邪惡國家!");    }  }  #endregion工廠類代碼  #region 中國兵工廠  abstract class chinaFactory  {    //裝甲車制造車間    public abstract Tank CreateTank();    //炸彈知道車間    public abstract Bomb CreateBomb();  }  //兵工廠前期制造  class qianqiFactory : chinaFactory  {       public override Bomb CreateBomb()    {      //導彈      return new daodanBomb();    }    public override Tank CreateTank()    {      //越野車      return new yueyeTank();    }  }  //兵工廠后期制造  class houqiFactory : chinaFactory  {    public override Bomb CreateBomb()    {      //核彈      return new hedanBomb();    }    public override Tank CreateTank()    {      //主站坦克      return new zhuzhanTank();    }  }  #endregion客戶端代碼:(打仗)  // 備戰  class Make  {    //裝備     private Bomb bomb;    private Tank tank;    //制造加工    public Make(chinaFactory factory)    {      bomb = factory.CreateBomb();      tank = factory.CreateTank();    }    //開始打仗    public void warStar()    {      //炸彈類爆炸      bomb.baozha();      //戰車類前進      tank.go();    }  }  public class start  {    public static void Main()    {      //大戰前期      chinaFactory qianqiMake = new qianqiFactory();      Make qianqi = new Make(qianqiMake);      qianqi.warStar();      //點任意鍵,進行后期攻勢??!      Console.ReadKey();      //大戰后期      chinaFactory houqiMake = new houqiFactory();      Make houqi = new Make(houqiMake);      houqi.warStar();      Console.WriteLine("釣魚島是中國的,神圣不可侵犯!小邪惡國家,滾開!!");      Console.ReadLine();    }  }


抽象工廠模式的定義和類圖

抽象工廠允許客戶使用抽象的接口來創建一組相關產品,而不需要知道或關心實際生產出的具體產品是什么。這樣客戶就可以從具體產品中被解耦。下面通過抽象工模式的類圖來了解各個類中之間的關系:

2016217144927859.png (633×457)

抽象工廠的分析
抽象工廠模式將具體產品的創建延遲到具體工廠的子類中,這樣將對象的創建封裝起來,可以減少客戶端與具體產品類之間的依賴,從而使系統耦合度低,這樣更有利于后期的維護和擴展,這真是抽象工廠模式的優點所在,然后抽象模式同時也存在不足的地方。下面就具體看下抽象工廠的缺點(缺點其實在前面的介紹中以已經涉及了):

抽象工廠模式很難支持新種類產品的變化。這是因為抽象工廠接口中已經確定了可以被創建的產品集合,如果需要添加新產品,此時就必須去修改抽象工廠的接口,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了“開發――封閉”原則。

知道了抽象工廠的優缺點之后,也就能很好地把握什么情況下考慮使用抽象工廠模式了,下面就具體看看使用抽象工廠模式的系統應該符合那幾個前提:

一個系統不要求依賴產品類實例如何被創建、組合和表達的表達,這點也是所有工廠模式應用的前提。
這個系統有多個系列產品,而系統中只消費其中某一系列產品
系統要求提供一個產品類的庫,所有產品以同樣的接口出現,客戶端不需要依賴具體實現。


.NET中抽象工廠模式實現
抽象工廠模式在實際中的應用也是相當頻繁的,然而在我們.NET類庫中也存在應用抽象工廠模式的類,這個類就是System.Data.Common.DbProviderFactory,這個類位于System.Data.dll程序集中,該類扮演抽象工廠模式中抽象工廠的角色,我們可以用reflector反編譯工具查看該類的實現:

/// 扮演抽象工廠的角色/// 創建連接數據庫時所需要的對象集合,/// 這個對象集合包括有 DbConnection對象(這個是抽象產品類,如絕味例子中的YaBo類)、DbCommand類、DbDataAdapter類,針對不同的具體工廠都需要實現該抽象類中方法,public abstract class DbProviderFactory{  // 提供了創建具體產品的接口方法  protected DbProviderFactory();  public virtual DbCommand CreateCommand();  public virtual DbCommandBuilder CreateCommandBuilder();  public virtual DbConnection CreateConnection();  public virtual DbConnectionStringBuilder CreateConnectionStringBuilder();  public virtual DbDataAdapter CreateDataAdapter();  public virtual DbDataSourceEnumerator CreateDataSourceEnumerator();  public virtual DbParameter CreateParameter();  public virtual CodeAccessPermission CreatePermission(PermissionState state);}DbProviderFactory類是一個抽象工廠類,該類提供了創建數據庫連接時所需要的對象集合的接口,實際創建的工作在其子類工廠中進行,微軟使用的是SQL Server數據庫,因此提供了連接SQL Server數據的具體工廠實現,具體代碼可以用反編譯工具查看,具體代碼如下:/// 扮演著具體工廠的角色,用來創建連接SQL Server數據所需要的對象public sealed class SqlClientFactory : DbProviderFactory, IServiceProvider{  // Fields  public static readonly SqlClientFactory Instance = new SqlClientFactory();  // 構造函數  private SqlClientFactory()  {  }        // 重寫抽象工廠中的方法  public override DbCommand CreateCommand()  { // 創建具體產品    return new SqlCommand();  }  public override DbCommandBuilder CreateCommandBuilder()  {    return new SqlCommandBuilder();  }  public override DbConnection CreateConnection()  {    return new SqlConnection();  }  public override DbConnectionStringBuilder CreateConnectionStringBuilder()  {    return new SqlConnectionStringBuilder();  }  public override DbDataAdapter CreateDataAdapter()  {    return new SqlDataAdapter();  }  public override DbDataSourceEnumerator CreateDataSourceEnumerator()  {    return SqlDataSourceEnumerator.Instance;  }  public override DbParameter CreateParameter()  {    return new SqlParameter();  }  public override CodeAccessPermission CreatePermission(PermissionState state)  {    return new SqlClientPermission(state);  }}

因為微軟只給出了連接SQL Server的具體工廠的實現,我們也可以自定義連接Oracle、MySql的具體工廠的實現。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
不卡伊人av在线播放| 国产精品aaa| 久热99视频在线观看| 狠狠操狠狠色综合网| 欧美电影在线播放| 日本三级韩国三级久久| 中文字幕亚洲激情| 欧美日韩亚洲激情| 91免费福利视频| 欧美性资源免费| 日本一区二区三区在线播放| 91在线精品视频| 国产亚洲一区二区在线| 国产精品99一区| 日韩在线视频线视频免费网站| 欧美成人免费va影院高清| 91精品视频播放| 精品视频在线播放色网色视频| 国产精品一区二区三区毛片淫片| 国产精品第一第二| 精品亚洲一区二区三区四区五区| 91午夜在线播放| 日本久久中文字幕| 韩曰欧美视频免费观看| 欧美精品激情视频| 久久久久久一区二区三区| 亚洲免费视频网站| 国产精自产拍久久久久久| 91免费精品国偷自产在线| 日韩av一卡二卡| 国产午夜精品全部视频播放| 亚洲欧美日韩精品| 97精品视频在线播放| 欧美电影免费观看高清| 97涩涩爰在线观看亚洲| 精品亚洲va在线va天堂资源站| 成人激情视频在线| 福利二区91精品bt7086| 97视频在线观看免费高清完整版在线观看| 精品成人久久av| 国产精品草莓在线免费观看| 久久久中精品2020中文| 欧美极品少妇全裸体| 奇米成人av国产一区二区三区| 亚洲尤物视频网| 欧美中文字幕在线观看| 青草热久免费精品视频| 国产亚洲日本欧美韩国| 国产成人精品免高潮在线观看| 久久久久久91香蕉国产| 欧美一级淫片aaaaaaa视频| 国产视频福利一区| 久久精品久久精品亚洲人| 精品久久久久久国产| 91国产精品视频在线| 在线看福利67194| 91手机视频在线观看| 成人黄色免费在线观看| 亚洲成人999| 在线视频欧美日韩精品| 国产精品久久网| 欧美高清性猛交| 久久成人亚洲精品| 日韩激情在线视频| 亚洲国产精品系列| 国产精品99久久久久久www| 不卡av在线网站| 国内精品久久久久影院 日本资源| 国内精品400部情侣激情| 亚洲天堂网站在线观看视频| 亚洲色图欧美制服丝袜另类第一页| 亚洲在线免费视频| 国产精品男人的天堂| 97超级碰在线看视频免费在线看| 亚洲成人a级网| 2019中文字幕全在线观看| 欧美性生交xxxxx久久久| 国产精品女主播| 91麻豆国产精品| 久久亚洲精品一区二区| 国产成人福利视频| 69av在线视频| 91久久中文字幕| 日韩日本欧美亚洲| 欧美日韩国产综合视频在线观看中文| 亚洲一区二区三区成人在线视频精品| 福利视频第一区| 久久成人综合视频| 韩国福利视频一区| 亚洲欧美国产日韩天堂区| 91精品国产91久久久久久最新| 亚洲精品丝袜日韩| 国产欧美日韩丝袜精品一区| 性夜试看影院91社区| 国产精品海角社区在线观看| 国产精品久久久久久久久久久久久久| 欧美在线中文字幕| 欧美性一区二区三区| 在线看欧美日韩| 亚洲xxx自由成熟| 欧美精品videosex性欧美| 欧美黄色免费网站| www.亚洲一区| 91经典在线视频| 国产精品美乳一区二区免费| 日韩免费在线观看视频| 欧美性受xxxx白人性爽| 国产亚洲精品高潮| 国产综合在线观看视频| 成人深夜直播免费观看| 中文字幕久精品免费视频| 日韩在线免费高清视频| 1769国内精品视频在线播放| 日韩视频在线免费观看| 国产精品久久久久aaaa九色| 欧美有码在线观看| 色噜噜狠狠狠综合曰曰曰88av| 成人激情在线观看| 色av中文字幕一区| 国产亚洲欧美日韩一区二区| 国产日韩在线免费| 亚洲精品视频网上网址在线观看| 亚洲国产精品va在线| 一区二区日韩精品| 一区二区在线视频播放| 欧美日韩国产一中文字不卡| 国产欧美日韩精品在线观看| 亚洲人av在线影院| 日韩在线免费视频观看| 亚洲免费伊人电影在线观看av| 亚洲高清福利视频| 亚洲精品久久7777777| 欧美肥婆姓交大片| 国产精品久久久久久超碰| 欧美一级淫片videoshd| 欧洲亚洲在线视频| 91高清免费视频| 成人情趣片在线观看免费| 国产精品老牛影院在线观看| 538国产精品一区二区在线| 中文字幕亚洲综合| 国产精品都在这里| 亚洲欧美日韩天堂一区二区| 91精品视频播放| 亚洲日本aⅴ片在线观看香蕉| 国产精品久久久久久久久男| 午夜精品蜜臀一区二区三区免费| 国产精品久久久久久久电影| 亚洲精品美女网站| 欧美一级视频免费在线观看| 中文字幕免费国产精品| 第一福利永久视频精品| 欧美激情亚洲自拍| 日韩av一区二区在线观看| 亚洲日本成人女熟在线观看| 黑人巨大精品欧美一区免费视频| 俺也去精品视频在线观看| 亚洲国产精品va| 91精品在线播放| 亚洲偷熟乱区亚洲香蕉av| 久久精品国亚洲| 亚洲第一色中文字幕| 精品美女久久久久久免费| 色777狠狠综合秋免鲁丝|