最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1. 概述

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

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

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

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

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

   2.4 具體產(chǎn)品(ConcreteProduct):抽象工廠模式所創(chuàng)建的任何產(chǎn)品對象都是某一個具體產(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 解決這個問題的根本是將應(yīng)用程序與數(shù)據(jù)庫解耦,使得應(yīng)用程序不再依賴某一個具體的數(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 兩個抽象產(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 將一個系列的產(chǎn)品族統(tǒng)一到一起創(chuàng)建

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

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

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

相關(guān)文章

  • C#操作XML通用方法匯總

    C#操作XML通用方法匯總

    這篇文章主要為大家詳細(xì)介紹了C#操作XML通用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • C#中使用DataContractSerializer類實(shí)現(xiàn)深拷貝操作示例

    C#中使用DataContractSerializer類實(shí)現(xiàn)深拷貝操作示例

    這篇文章主要介紹了C#中使用DataContractSerializer類實(shí)現(xiàn)深拷貝操作示例,本文給出了實(shí)現(xiàn)深拷貝方法、測試深拷貝方法例子、DataContractSerializer類實(shí)現(xiàn)深拷貝的原理等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • ItemsControl 數(shù)據(jù)綁定的兩種方式

    ItemsControl 數(shù)據(jù)綁定的兩種方式

    這篇文章主要介紹了ItemsControl 數(shù)據(jù)綁定的兩種方式,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • c#實(shí)現(xiàn)windows遠(yuǎn)程桌面連接程序代碼

    c#實(shí)現(xiàn)windows遠(yuǎn)程桌面連接程序代碼

    本篇文章主要介紹了c#實(shí)現(xiàn)windows遠(yuǎn)程桌面連接程序代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 利用C#實(shí)現(xiàn)SSLSocket加密通訊的方法詳解

    利用C#實(shí)現(xiàn)SSLSocket加密通訊的方法詳解

    這篇文章主要給大家介紹了關(guān)于如何利用C#實(shí)現(xiàn)SSLSocket加密通訊的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C#實(shí)現(xiàn)Modbus通信功能的示例詳解

    C#實(shí)現(xiàn)Modbus通信功能的示例詳解

    Modbus作為一種開放且廣泛采用的通信協(xié)議,在實(shí)現(xiàn)設(shè)備間數(shù)據(jù)交換方面發(fā)揮著至關(guān)重要的作用,它不僅支持多種物理層接口(如RS-232,?RS-485,?以及以太網(wǎng)),還因其簡單易用的特點(diǎn)而被大家所青睞,本文通過實(shí)際示例介紹如何在C#項(xiàng)目中輕松實(shí)現(xiàn)Modbus通信功能
    2024-11-11
  • WCF實(shí)現(xiàn)的計算器功能實(shí)例

    WCF實(shí)現(xiàn)的計算器功能實(shí)例

    這篇文章主要介紹了WCF實(shí)現(xiàn)的計算器功能,結(jié)合具體實(shí)例形式較為詳細(xì)的分析了WCF實(shí)現(xiàn)計算器功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • C#中Abstract 、Virtual和Override的使用及區(qū)別

    C#中Abstract 、Virtual和Override的使用及區(qū)別

    C#中virtual,abstract,override用于方法重載,子類覆蓋了父類的相同方法,父類中的實(shí)現(xiàn)不可能再被外面調(diào)用。本文給大家重點(diǎn)介紹C#中Abstract 、Virtual和Override的使用及區(qū)別,需要的朋友參考下吧
    2021-06-06
  • c# dynamic的好處

    c# dynamic的好處

    這篇文章主要介紹了c# dynamic的好處,以示例代碼幫助大家更好的了解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-12-12
  • c#調(diào)用c++的DLL的實(shí)現(xiàn)方法

    c#調(diào)用c++的DLL的實(shí)現(xiàn)方法

    本文主要介紹了c#調(diào)用c++的DLL的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評論

巴楚县| 大方县| 漳平市| 枝江市| 江安县| 会昌县| 大同县| 墨玉县| 澄迈县| 张家口市| 三门县| 凌海市| 大姚县| 奈曼旗| 广饶县| 静海县| 塔河县| 万盛区| 肃南| 白城市| 疏勒县| 台安县| 天长市| 青州市| 庐江县| 崇义县| 伊春市| 淮北市| 怀宁县| 海安县| 通化市| 民和| 靖远县| 靖宇县| 梓潼县| 济阳县| 碌曲县| 夏邑县| 文安县| 上饶县| 阳城县|