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

C# 設(shè)計(jì)模式系列教程-抽象工廠模式

 更新時(shí)間:2016年06月02日 10:21:15   作者:Wang Juqiang  
抽象工廠模式為創(chuàng)建一組相關(guān)或相互依賴的對象提供一個(gè)接口,而且無需指定他們的具體類。

1. 概述

  抽象工廠模式為一個(gè)產(chǎn)品家族提供了統(tǒng)一的創(chuàng)建接口。當(dāng)需要這個(gè)產(chǎn)品家族的某一系列的時(shí)候,可以從抽象工廠中選出相對應(yīng)的系列來創(chuàng)建一個(gè)具體的工廠類別。

2. 抽象工廠模式中的角色

   2.1 抽象工廠(AbstractFactory):擔(dān)任這個(gè)角色的是工廠方法模式的核心,它是與應(yīng)用系統(tǒng)商業(yè)邏輯無關(guān)的。

   2.2 具體工廠(ConcreteFactory):這個(gè)角色直接在客戶端的調(diào)用下創(chuàng)建產(chǎn)品的實(shí)例。這個(gè)角色含有選擇合適的產(chǎn)品對象的邏輯,而這個(gè)邏輯是與應(yīng)用系統(tǒng)的商業(yè)邏輯緊密相關(guān)的。

   2.3 抽象產(chǎn)品(AbstractProduct):擔(dān)任這個(gè)角色的類是工廠方法模式所創(chuàng)建的對象的父類,或它們共同擁有的接口。

   2.4 具體產(chǎn)品(ConcreteProduct):抽象工廠模式所創(chuàng)建的任何產(chǎn)品對象都是某一個(gè)具體產(chǎn)品類的實(shí)例。這是客戶端最終需要的東西,其內(nèi)部一定充滿了應(yīng)用系統(tǒng)的商業(yè)邏輯。

3. 實(shí)例:更換數(shù)據(jù)庫。現(xiàn)有系統(tǒng)使用的是SqlServer數(shù)據(jù)庫,它的Licence是付費(fèi)的,有的客戶想使用免費(fèi)的數(shù)據(jù)庫服務(wù),如Access。有的客戶擁有其它數(shù)據(jù)庫服務(wù)商的Licence,他們也不想使用還要另付費(fèi)的SqlServer。

   3.1 解決這個(gè)問題的根本是將應(yīng)用程序與數(shù)據(jù)庫解耦,使得應(yīng)用程序不再依賴某一個(gè)具體的數(shù)據(jù)庫。抽象工廠給我們提供了解決方案。

   3.2 實(shí)現(xiàn)類圖

http://img.jbzj.com/file_images/article/201606/201606021022164.png

  3.3 實(shí)現(xiàn)代碼

    3.3.1 抽象工廠類,提供了創(chuàng)建一組相關(guān)或相互依賴的對象的接口。

 /// <summary>
 /// 抽象工廠類
 /// </summary>
 public interface IDatabaseFactory
 {

  IEmployee CreateEmployee();

  IUser CreateUser();
 }

    3.3.2 具體工廠類,提供了創(chuàng)建SqlServer,或Access具體產(chǎn)品的實(shí)現(xiàn)

 /// <summary>
 /// 與SqlServer相關(guān)產(chǎn)品的實(shí)現(xiàn)
 /// </summary>
 public class SqlServerDatabaseFactory : IDatabaseFactory
 {

  public IEmployee CreateEmployee()
  {

   return new SqlEmployee();
  }

  public IUser CreateUser()
  {

   return new SqlUser();
  }

 }


 /// <summary>
 /// 與Access相關(guān)產(chǎn)品的實(shí)現(xiàn)
 /// </summary>
 public class AccessDatabaseFactory : IDatabaseFactory
 {

  public IEmployee CreateEmployee()
  {

   return new AccessEmployee();
  }

  public IUser CreateUser()
  {

   return new AccessUser();
  }

 }

    3.3.3 兩個(gè)抽象產(chǎn)品,分別是IUser和IEmployee

 /// <summary>
 /// 抽象產(chǎn)品
 /// </summary>
 public interface IUser 
 {
  User GetUser();

  bool SaveUser();
 }

 /// <summary>
 /// 抽象產(chǎn)品
 /// </summary>
 public interface IEmployee
 {

  Employee GetEmployee();

  bool SaveEmployee();
 }

  3.3.4 具體產(chǎn)品的實(shí)現(xiàn)

 /// <summary>
 /// 與SqlServer相關(guān)的具體產(chǎn)品User
 /// </summary>
 public class SqlUser : IUser
 {
  public User GetUser()
  {

   return null;
  }

  public bool SaveUser()
  {

   return false;
  }

 }

 /// <summary>
 /// 與SqlServer相關(guān)的具體產(chǎn)品Employee
 /// </summary>
 public class SqlEmployee : IEmployee
 {

  public SqlEmployee()
  {

  }

  public Employee GetEmployee()
  {

   return null;
  }

  public bool SaveEmployee()
  {

   return false;
  }

 }

 /// <summary>
 /// 與Access相關(guān)的具體產(chǎn)品User
 /// </summary>
 public class AccessUser : IUser
 {

  public AccessUser()
  {

  }

  public User GetUser()
  {

   return null;
  }

  public bool SaveUser()
  {

   return false;
  }

 }

 /// <summary>
 /// 與Access相關(guān)的具體產(chǎn)品Employee
 /// </summary>
 public class AccessEmployee : IEmployee
 {

  public AccessEmployee()
  {

  }

  public Employee GetEmployee()
  {

   return null;
  }

  public bool SaveEmployee()
  {

   return false;
  }

 }

4. 模式總結(jié)

  4.1 優(yōu)點(diǎn)
    4.1.1 具體產(chǎn)品從客戶代碼中被分離出來
    4.1.2 容易改變產(chǎn)品的系列(如SqlServer產(chǎn)品系列,Access產(chǎn)品系列)
    4.1.3 將一個(gè)系列的產(chǎn)品族統(tǒng)一到一起創(chuàng)建

  4.2 缺點(diǎn)
    在產(chǎn)品族中擴(kuò)展新的產(chǎn)品是很困難的,它需要修改抽象工廠的接口,如增加一種產(chǎn)品Customer變得非常困難。

  4.3 實(shí)用范圍
    4.3.1 一個(gè)系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建、組合和表示時(shí)。
    4.3.2 一個(gè)系統(tǒng)要由多個(gè)產(chǎn)品系列中的一個(gè)來配置時(shí)。
    4.3.3 當(dāng)你要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)。
    4.3.4 當(dāng)你提供一個(gè)產(chǎn)品類庫,而只想顯示它們的接口而不是實(shí)現(xiàn)時(shí)。

以上就是本文的全部內(nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論