欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C#的設(shè)計(jì)模式編程之抽象工廠(chǎng)模式的應(yīng)用

 更新時(shí)間:2016年02月17日 14:50:55   作者:張龍豪  
這篇文章主要介紹了C#的設(shè)計(jì)模式編程之抽象工廠(chǎng)模式的應(yīng)用,注意區(qū)分一下簡(jiǎn)單工廠(chǎng)模式、工廠(chǎng)方法模式和抽象工廠(chǎng)模式概念之間的區(qū)別,需要的朋友可以參考下

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

抽象工廠(chǎng)模式比其它工廠(chǎng)模式更加抽象,抽象工廠(chǎng)模式適用與多個(gè)抽象類(lèi)的情況下,通過(guò)工廠(chǎng)返回多個(gè)抽象類(lèi)中你需要得到的具體子類(lèi)實(shí)例。

舉例闡述抽象工廠(chǎng)模式:
假如中國(guó)對(duì)邪惡國(guó)家開(kāi)戰(zhàn)。

中國(guó)裝備:炸彈類(lèi),坦克類(lèi),來(lái)消滅邪惡國(guó)家。

炸彈類(lèi):導(dǎo)彈,核彈;

坦克類(lèi):越野車(chē),主站坦克;

戰(zhàn)略:

前期中國(guó)兵工廠(chǎng)生產(chǎn):導(dǎo)彈,越野車(chē),打擊邪惡國(guó)家。

后期中國(guó)兵工廠(chǎng)生產(chǎn):核彈,主站坦克,毀滅邪惡國(guó)家。

類(lèi)圖:

2016217144844885.png (1091×595)

裝備類(lèi)代碼:

  #region 炸彈系列
  abstract class Bomb
  {
    abstract public void baozha();
  }
  /// <summary>
  /// 導(dǎo)彈
  /// </summary>
  class daodanBomb :Bomb
  {
    public override void baozha()
    {
      Console.WriteLine("我是一顆中國(guó)造導(dǎo)彈,來(lái)轟炸不老實(shí)的小邪惡國(guó)家!");
    }
  }
  /// <summary>
  /// 核彈
  /// </summary>
  class hedanBomb : Bomb
  {
    public override void baozha()
    {
      Console.WriteLine("我是一顆中國(guó)造核彈,來(lái)轟炸不老實(shí)的小邪惡國(guó)家!");
    }
  }
  #endregion

  #region 坦克系列
  abstract class Tank
  {
    abstract public void go();
  }
  /// <summary>
  /// 越野車(chē)
  /// </summary>
  class yueyeTank : Tank
  {
    public override void go()
    {
      Console.WriteLine("我是一顆中國(guó)造越野車(chē),來(lái)踏平不老實(shí)的小邪惡國(guó)家!");
    }
  }
  /// <summary>
  /// 主站坦克
  /// </summary>
  class zhuzhanTank : Tank
  {
    public override void go()
    {
      Console.WriteLine("我是一顆中國(guó)造主站坦克,來(lái)踏平不老實(shí)的小邪惡國(guó)家!");
    }
  }
  #endregion工廠(chǎng)類(lèi)代碼


  #region 中國(guó)兵工廠(chǎng)
  abstract class chinaFactory
  {
    //裝甲車(chē)制造車(chē)間
    public abstract Tank CreateTank();
    //炸彈知道車(chē)間
    public abstract Bomb CreateBomb();
  }
  //兵工廠(chǎng)前期制造
  class qianqiFactory : chinaFactory
  {   
    public override Bomb CreateBomb()
    {
      //導(dǎo)彈
      return new daodanBomb();
    }
    public override Tank CreateTank()
    {
      //越野車(chē)
      return new yueyeTank();
    }
  }
  //兵工廠(chǎng)后期制造
  class houqiFactory : chinaFactory
  {
    public override Bomb CreateBomb()
    {
      //核彈
      return new hedanBomb();
    }
    public override Tank CreateTank()
    {
      //主站坦克
      return new zhuzhanTank();
    }
  }
  #endregion客戶(hù)端代碼:(打仗)


  // 備戰(zhàn)
  class Make
  {
    //裝備 
    private Bomb bomb;
    private Tank tank;
    //制造加工
    public Make(chinaFactory factory)
    {
      bomb = factory.CreateBomb();
      tank = factory.CreateTank();
    }

    //開(kāi)始打仗
    public void warStar()
    {
      //炸彈類(lèi)爆炸
      bomb.baozha();
      //戰(zhàn)車(chē)類(lèi)前進(jìn)
      tank.go();
    }

  }
  public class start
  {
    public static void Main()
    {
      //大戰(zhàn)前期
      chinaFactory qianqiMake = new qianqiFactory();
      Make qianqi = new Make(qianqiMake);
      qianqi.warStar();

      //點(diǎn)任意鍵,進(jìn)行后期攻勢(shì)?。?
      Console.ReadKey();

      //大戰(zhàn)后期
      chinaFactory houqiMake = new houqiFactory();
      Make houqi = new Make(houqiMake);
      houqi.warStar();

      Console.WriteLine("釣魚(yú)島是中國(guó)的,神圣不可侵犯!小邪惡國(guó)家,滾開(kāi)??!");
      Console.ReadLine();
    }
  }


抽象工廠(chǎng)模式的定義和類(lèi)圖

抽象工廠(chǎng)允許客戶(hù)使用抽象的接口來(lái)創(chuàng)建一組相關(guān)產(chǎn)品,而不需要知道或關(guān)心實(shí)際生產(chǎn)出的具體產(chǎn)品是什么。這樣客戶(hù)就可以從具體產(chǎn)品中被解耦。下面通過(guò)抽象工模式的類(lèi)圖來(lái)了解各個(gè)類(lèi)中之間的關(guān)系:

2016217144927859.png (633×457)

抽象工廠(chǎng)的分析
抽象工廠(chǎng)模式將具體產(chǎn)品的創(chuàng)建延遲到具體工廠(chǎng)的子類(lèi)中,這樣將對(duì)象的創(chuàng)建封裝起來(lái),可以減少客戶(hù)端與具體產(chǎn)品類(lèi)之間的依賴(lài),從而使系統(tǒng)耦合度低,這樣更有利于后期的維護(hù)和擴(kuò)展,這真是抽象工廠(chǎng)模式的優(yōu)點(diǎn)所在,然后抽象模式同時(shí)也存在不足的地方。下面就具體看下抽象工廠(chǎng)的缺點(diǎn)(缺點(diǎn)其實(shí)在前面的介紹中以已經(jīng)涉及了):

抽象工廠(chǎng)模式很難支持新種類(lèi)產(chǎn)品的變化。這是因?yàn)槌橄蠊S(chǎng)接口中已經(jīng)確定了可以被創(chuàng)建的產(chǎn)品集合,如果需要添加新產(chǎn)品,此時(shí)就必須去修改抽象工廠(chǎng)的接口,這樣就涉及到抽象工廠(chǎng)類(lèi)的以及所有子類(lèi)的改變,這樣也就違背了“開(kāi)發(fā)——封閉”原則。

知道了抽象工廠(chǎng)的優(yōu)缺點(diǎn)之后,也就能很好地把握什么情況下考慮使用抽象工廠(chǎng)模式了,下面就具體看看使用抽象工廠(chǎng)模式的系統(tǒng)應(yīng)該符合那幾個(gè)前提:

一個(gè)系統(tǒng)不要求依賴(lài)產(chǎn)品類(lèi)實(shí)例如何被創(chuàng)建、組合和表達(dá)的表達(dá),這點(diǎn)也是所有工廠(chǎng)模式應(yīng)用的前提。
這個(gè)系統(tǒng)有多個(gè)系列產(chǎn)品,而系統(tǒng)中只消費(fèi)其中某一系列產(chǎn)品
系統(tǒng)要求提供一個(gè)產(chǎn)品類(lèi)的庫(kù),所有產(chǎn)品以同樣的接口出現(xiàn),客戶(hù)端不需要依賴(lài)具體實(shí)現(xiàn)。


.NET中抽象工廠(chǎng)模式實(shí)現(xiàn)
抽象工廠(chǎng)模式在實(shí)際中的應(yīng)用也是相當(dāng)頻繁的,然而在我們.NET類(lèi)庫(kù)中也存在應(yīng)用抽象工廠(chǎng)模式的類(lèi),這個(gè)類(lèi)就是System.Data.Common.DbProviderFactory,這個(gè)類(lèi)位于System.Data.dll程序集中,該類(lèi)扮演抽象工廠(chǎng)模式中抽象工廠(chǎng)的角色,我們可以用reflector反編譯工具查看該類(lèi)的實(shí)現(xiàn):

/// 扮演抽象工廠(chǎng)的角色
/// 創(chuàng)建連接數(shù)據(jù)庫(kù)時(shí)所需要的對(duì)象集合,
/// 這個(gè)對(duì)象集合包括有 DbConnection對(duì)象(這個(gè)是抽象產(chǎn)品類(lèi),如絕味例子中的YaBo類(lèi))、DbCommand類(lèi)、DbDataAdapter類(lèi),針對(duì)不同的具體工廠(chǎng)都需要實(shí)現(xiàn)該抽象類(lèi)中方法,
public abstract class DbProviderFactory
{
  // 提供了創(chuàng)建具體產(chǎn)品的接口方法
  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類(lèi)是一個(gè)抽象工廠(chǎng)類(lèi),該類(lèi)提供了創(chuàng)建數(shù)據(jù)庫(kù)連接時(shí)所需要的對(duì)象集合的接口,實(shí)際創(chuàng)建的工作在其子類(lèi)工廠(chǎng)中進(jìn)行,微軟使用的是SQL Server數(shù)據(jù)庫(kù),因此提供了連接SQL Server數(shù)據(jù)的具體工廠(chǎng)實(shí)現(xiàn),具體代碼可以用反編譯工具查看,具體代碼如下:

/// 扮演著具體工廠(chǎng)的角色,用來(lái)創(chuàng)建連接SQL Server數(shù)據(jù)所需要的對(duì)象
public sealed class SqlClientFactory : DbProviderFactory, IServiceProvider
{
  // Fields
  public static readonly SqlClientFactory Instance = new SqlClientFactory();
  // 構(gòu)造函數(shù)
  private SqlClientFactory()
  {
  }
      
  // 重寫(xiě)抽象工廠(chǎng)中的方法
  public override DbCommand CreateCommand()
  { // 創(chuàng)建具體產(chǎn)品
    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);
  }
}

因?yàn)槲④浿唤o出了連接SQL Server的具體工廠(chǎng)的實(shí)現(xiàn),我們也可以自定義連接Oracle、MySql的具體工廠(chǎng)的實(shí)現(xiàn)。

相關(guān)文章

最新評(píng)論