C#學習筆記-抽象工廠模式

来源:http://www.cnblogs.com/Aries-rong/archive/2017/11/10/7799597.html
-Advertisement-
Play Games

題目1:數據訪問,通過資料庫對用戶表單的進行訪問,資料庫包含SQL Server,對用戶表單進行“新增用戶”和“查詢用戶”信息等操作。 分析: 首先,確認用戶表單,裡面包含兩個ID和Name兩個欄位,兩種欄位可以讀寫功能; 單獨準備一個資料庫的類,然後直接對用戶直接進行操作即可。 實現: 1 usi ...


題目1:數據訪問,通過資料庫對用戶表單的進行訪問,資料庫包含SQL Server,對用戶表單進行“新增用戶”和“查詢用戶”信息等操作。

分析:

  首先,確認用戶表單,裡面包含兩個ID和Name兩個欄位,兩種欄位可以讀寫功能;

  單獨準備一個資料庫的類,然後直接對用戶直接進行操作即可。

實現:

 1 using System;
 2 
 3 namespace 抽象工廠模式
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             //向su資料庫中添加user這個新的用戶
10             User user = new User();
11             // bug:不能更換資料庫的原因是su這個資料庫已經被框死在了SQL Server上
12             SqlserverUser su = new SqlserverUser();
13             su.Insert(user);
14 
15             //在su的資料庫中查找unknownUser這個用戶
16             User unknownUser = new User();
17             unknownUser = su.GetUser(5);
18 
19             Console.Read();
20         }
21     }
22 
23     /// <summary>
24     /// 用戶類
25     /// 準備ID和Name兩個欄位
26     /// </summary>
27     class User
28     {
29         private int _id;
30         private string _name;
31 
32         public int Id
33         {
34             get { return _id; }
35             set { _id = value; }
36         }
37         public string Name
38         {
39             get { return _name; }
40             set { _name = value; }
41         }
42     }
43 
44     /// <summary>
45     /// 用於操作User表
46     /// “增加用戶”和“得到用戶”兩種方法
47     /// </summary>
48     class SqlserverUser
49     {
50         /// <summary>
51         /// 增加用戶信息
52         /// </summary>
53         /// <param name="user">新的用戶信息</param>
54         public void Insert(User user)
55         {
56             Console.WriteLine("在SQL server中給User增加一條記錄");
57         }
58         /// <summary>
59         /// 得到用戶方法
60         /// </summary>
61         /// <param name="id">(傳入信息)通過用戶的id值</param>
62         /// <returns>(返回信息)通過id值得到對應的用戶數據</returns>
63         public User GetUser(int id)
64         {
65             Console.WriteLine("在SQL Server中根據ID得到User表一條記錄");
66             return null;
67         }
68     }
69 }
View Code

 

 

題目2:在1的基礎上,我們增加新的資料庫Access,同樣對剛纔的資料庫進行訪問。

分析:

  基於1的基礎上,SqlserverUser su = new SqlserverUser();將資料庫的對象定死在了SQL Server上了,這就出現了很大的局限性。

  為了將SQL與Access靈活使用,我們就需要用到工廠方法模式來封裝資料庫,讓子類決定實例化哪一個類。

實現:

  1 using System;
  2 
  3 namespace 抽象工廠模式2
  4 {
  5     class Program
  6     {
  7         static void Main(string[] args)
  8         {
  9             //向iu資料庫中添加user這個新的用戶
 10             User user = new User();
 11             IFactory factory = new SqlServerFactory();  //若要更改成Access資料庫 將SqlServerFactory換成AccessFactory即可
 12             IUser iu = factory.CreateUser();
 13             iu.Insert(user);
 14 
 15             //在iu的資料庫中查找unknownUser這個用戶
 16             User unknownUser = new User();
 17             unknownUser = iu.GetUser(5);
 18 
 19             Console.Read();
 20         }
 21     }
 22 
 23     /// <summary>
 24     /// 用戶類
 25     /// 準備ID和Name兩個欄位
 26     /// </summary>
 27     class User
 28     {
 29         private int _id;
 30         private string _name;
 31 
 32         public int Id
 33         {
 34             get { return _id; }
 35             set { _id = value; }
 36         }
 37         public string Name
 38         {
 39             get { return _name; }
 40             set { _name = value; }
 41         }
 42     }
 43 
 44 
 45     interface IUser
 46     {
 47         void Insert(User user);
 48         User GetUser(int id);
 49     }
 50         
 51     /// <summary>
 52     /// 用於訪問SQL Server的User
 53     /// “增加用戶”和“得到用戶”兩種方法
 54     /// </summary>
 55     class SqlserverUser:IUser
 56     {
 57         /// <summary>
 58         /// 增加用戶信息
 59         /// </summary>
 60         /// <param name="user">新的用戶信息</param>
 61         public void Insert(User user)
 62         {
 63             Console.WriteLine("在SQL server中給User增加一條記錄");
 64         }
 65         /// <summary>
 66         /// 得到用戶方法
 67         /// </summary>
 68         /// <param name="id">(傳入信息)通過用戶的id值</param>
 69         /// <returns>(返回信息)通過id值得到對應的用戶數據</returns>
 70         public User GetUser(int id)
 71         {
 72             Console.WriteLine("在SQL Server中根據ID得到User表一條記錄");
 73             return null;
 74         }
 75     }
 76     /// <summary>
 77     /// 用戶訪問Access的User
 78     /// </summary>
 79     class AccessUser : IUser
 80     {
 81         public User GetUser(int id)
 82         {
 83             Console.WriteLine("在Access中根據ID得到User表一條記錄");
 84             return null;
 85         }
 86 
 87         public void Insert(User user)
 88         {
 89             Console.WriteLine("在Access中給User增加一條記錄");
 90         }
 91     }
 92     /// <summary>
 93     /// 介面
 94     /// 定義了一個創建訪問User表對象的抽象的工廠介面
 95     /// </summary>
 96     interface IFactory
 97     {
 98         //因為sql和access都繼承於IUser,所以返回值設定為IUser即可
 99         IUser CreateUser();
100     }
101     /// <summary>
102     /// 實現IFactory介面,實例化SqlserverUser
103     /// </summary>
104     class SqlServerFactory : IFactory
105     {
106         public IUser CreateUser()
107         {
108             return new SqlserverUser();
109         }
110     }
111     /// <summary>
112     /// 實現IFactory介面,實例化AccessUser
113     /// </summary>
114     class AccessFactory : IFactory
115     {
116         public IUser CreateUser()
117         {
118             return new AccessUser();
119         }
120     }
121 }
View Code

 

 

題目3:在2是我基礎上,我們再增加一個信息表,例如Department表來記錄信息。

分析:

  這裡Department與User是一樣信息,所以和Department的構造與User類似,再同時修改工廠類及其子類信息即可。

  這裡需要使用的就是抽象工廠模式(Abstract Factory),提供一個 創建一系列相關或者互相依賴對象的介面,而無需指定他們具體的類。

實現:

  1 using System;
  2 
  3 namespace 抽象工廠模式3
  4 {
  5     class Program
  6     {
  7         static void Main(string[] args)
  8         {
  9             //向iu資料庫中添加user這個新的用戶
 10             User user = new User();
 11             IFactory factory = new AccessFactory();  
 12             IUser iu = factory.CreateUser();
 13             iu.Insert(user);
 14 
 15             //在iu的資料庫中查找unknownUser這個用戶
 16             User unknownUser = new User();
 17             unknownUser = iu.GetUser(5);
 18 
 19             //向id資料庫中添加dept這個新的用戶
 20             Department dept = new Department();
 21             IDepartment id = factory.CreateDepartment();
 22             id.Insert(dept);
 23 
 24             //在id的資料庫中查找unknownDept這個用戶
 25             Department unknownDept = new Department();
 26             unknownDept = id.GetDepartment(3);
 27 
 28             Console.Read();
 29         }
 30     }
 31 
 32 
 33     /// <summary>
 34     /// 用戶類
 35     /// 準備ID和Name兩個欄位
 36     /// </summary>
 37     class User
 38     {
 39         private int _id;
 40         private string _name;
 41 
 42         public int Id
 43         {
 44             get { return _id; }
 45             set { _id = value; }
 46         }
 47         public string Name
 48         {
 49             get { return _name; }
 50             set { _name = value; }
 51         }
 52     }
 53     /// <summary>
 54     /// 增加一個Department表
 55     /// </summary>
 56     class Department
 57     {
 58         private int _id;
 59         private string _deptName;
 60 
 61         public int Id
 62         {
 63             get { return _id; }
 64             set { _id = value; }
 65         }
 66 
 67         public string DeptName
 68         {
 69             get { return _deptName; }
 70             set { _deptName = value; }
 71         }
 72     }
 73 
 74 
 75 
 76     interface IUser
 77     {
 78         void Insert(User user);
 79         User GetUser(int id);
 80     }
 81 
 82     /// <summary>
 83     /// 用於訪問SQL Server的User
 84     /// “增加用戶”和“得到用戶”兩種方法
 85     /// </summary>
 86     class SqlserverUser : IUser
 87     {
 88         /// <summary>
 89         /// 增加用戶信息
 90         /// </summary>
 91         /// <param name="user">新的用戶信息</param>
 92         public void Insert(User user)
 93         {
 94             Console.WriteLine("在SQL server中給User增加一條記錄");
 95         }
 96         /// <summary>
 97         /// 得到用戶方法
 98         /// </summary>
 99         /// <param name="id">(傳入信息)通過用戶的id值</param>
100         /// <returns>(返回信息)通過id值得到對應的用戶數據</returns>
101         public User GetUser(int id)
102         {
103             Console.WriteLine("在SQL Server中根據ID得到User表一條記錄");
104             return null;
105         }
106     }
107     /// <summary>
108     /// 用戶訪問Access的User
109     /// </summary>
110     class AccessUser : IUser
111     {
112         public User GetUser(int id)
113         {
114             Console.WriteLine("在Access中根據ID得到User表一條記錄");
115             return null;
116         }
117 
118         public void Insert(User user)
119         {
120             Console.WriteLine("在Access中給User增加一條記錄");
121         }
122     }
123 
124 
125 
126     /// <summary>
127     /// 與User表一致
128     /// </summary>
129     interface IDepartment
130     {
131         void Insert(Department department);
132         Department GetDepartment(int id);
133     }
134     class SqlserverDepartment : IDepartment
135     {
136         public Department GetDepartment(int id)
137         {
138             Console.WriteLine("在SQL Server中根據ID得到Department表一條記錄");
139             return null;
140         }
141 
142         public void Insert(Department department)
143         {
144             Console.WriteLine("在SQL server中給Department增加一條記錄");
145         }
146     }
147     class AccessDepartment : IDepartment
148     {
149         public Department GetDepartment(int id)
150         {
151             Console.WriteLine("在Access中根據ID得到Department表一條記錄");
152             return null;
153         }
154 
155         public void Insert(Department department)
156         {
157             Console.WriteLine("在Access中給Department增加一條記錄");
158         }
159 
160     }
161 
162 
163 
164     
165     /// <summary>
166     /// 介面
167     /// 定義了一個創建訪問User表對象的抽象的工廠介面
168     /// </summary>
169     interface IFactory
170     {
171         //因為sql和access都繼承於IUser,所以返回值設定為IUser即可
172         IUser CreateUser();
173         IDepartment CreateDepartment();
174     }
175     /// <summary>
176     /// 實現IFactory介面,實例化SqlserverUser
177     /// </summary>
178     class SqlServerFactory : IFactory
179     {
180         public IDepartment CreateDepartment()
181         {
182             return new SqlserverDepartment();
183         }
184 
185         public IUser CreateUser()
186         {
187             return new SqlserverUser();
188         }
189 
190     }
191     /// <summary>
192     /// 實現IFactory介面,實例化AccessUser
193     /// </summary>
194     class AccessFactory : IFactory
195     {
196         public IDepartment CreateDepartment()
197         {
198             return new AccessDepartment();
199         }
200 
201         public IUser CreateUser()
202         {
203             return new AccessUser();
204         }
205     }
206 }
View Code

 

 

題目4:在3中我們可以得知,如果增加一個信息表Project,就意味著需要增加信息表本身的三個類:IProject、SqlserverProject、AccessProject,同時還需要更改Ifactory、SqlserverFactory和AccessFactory才可以完全實現,那麼如果我有100個調用資料庫訪問的類,工作量將變得巨大。

分析:

  信息表本身的類是無法刪減的,所以我們只有從工廠類來入手,我們將IFactory、SqlserverFactory和AccessFactory三個工廠類去除,用一個DataAccess類來代替,簡化代碼。

實現:

  1 using System;
  2 
  3 namespace 抽象工廠模式4
  4 {
  5     class Program
  6     {
  7         static void Main(string[] args)
  8         {
  9             //向iu資料庫中添加user這個新的用戶
 10             User user = new User();
 11             IUser iu = DataAccess.CreateUser();     //直接得到實際的資料庫訪問實例,不存在任何依賴
 12             iu.Insert(user);
 13 
 14             //在iu的資料庫中查找unknownUser這個用戶
 15             User unknownUser = new User();
 16             unknownUser = iu.GetUser(5);
 17 
 18             //向id資料庫中添加dept這個新的用戶
 19             Department dept = new Department();
 20             IDepartment id = DataAccess.CreateDepartment();
 21             id.Insert(dept);
 22 
 23             //在id的資料庫中查找unknownDept這個用戶
 24             Department unknownDept = new Department();
 25             unknownDept = id.GetDepartment(3);
 26 
 27             Console.Read();
 28         }
 29     }
 30 
 31 
 32     /// <summary>
 33     /// 用戶類
 34     /// 準備ID和Name兩個欄位
 35     /// </summary>
 36     class User
 37     {
 38         private int _id;
 39         private string _name;
 40 
 41         public int Id
 42         {
 43             get { return _id; }
 44             set { _id = value; }
 45         }
 46         public string Name
 47         {
 48             get { return _name; }
 49             set { _name = value; }
 50         }
 51     }
 52     /// <summary>
 53     /// 增加一個Department表
 54     /// </summary>
 55     class Department
 56     {
 57         private int _id;
 58         private string _deptName;
 59 
 60         public int Id
 61         {
 62             get { return _id; }
 63             set { _id = value; }
 64         }
 65 
 66         public string DeptName
 67         {
 68             get { return _deptName; }
 69             set { _deptName = value; }
 70         }
 71     }
 72 
 73 
 74 
 75     interface IUser
 76     {
 77         void Insert(User user);
 78         User GetUser(int id);
 79     }
 80 
 81     /// <summary>
 82
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DTOJ 2703:兩個數的餘數和商 解題報告 ——翱翔的逗比w ...
  • Pandas數據特征分析 數據的排序 將一組數據通過摘要(有損地提取數據特征的過程)的方式,可以獲得基本統計(含排序)、分佈/累計統計、數據特征(相關性、周期性等)、數據挖掘(形成知識)。 .sort_index()方法在指定軸上根據索引進行排序,預設升序 .sort_index(axis=0, a ...
  • 說到現在程式員的工資,大家想到的都是一個字:高! 然後有人就說,如今人人轉IT,未來程式員供過於求,肯定會成為白菜價。 現在的程式員平均起薪工資約5K、6K,工作幾年後動輒3W、5W,相比其他行業的技術崗位來說,似乎充滿了泡沫。 而且不瞭解IT行業,或對行業認知太淺的大部分人都認為這是普遍的經濟規律 ...
  • 一、認識標簽 1,說明:傳統標簽編程在開發中基本用不到,學習標簽編程主要還是為了完善知識體系。 2,標簽的主要作用:移除或減少jsp中的java代碼 3,標簽的主要組成部分及運行原理 4,簡單標簽示例:繼承javax.servlet.jsp.tagext.TagSupport 標簽開發步驟 4.1編 ...
  • 在C++類中,由static定義的(靜態)數據成員 和 (靜態)函數成員屬於類;相反沒有被static定義的成員和函數稱為實例數據成員和實例函數成員,他們屬於某一個實例(對象)。 在記憶體中,類的靜態數據成員占有一塊特定的記憶體空間,被該類的所有實例(對象)共用。而同一個類的不同對象的實例數據成員相互獨 ...
  • 解決辦法:https://github.com/alibaba/fastjson/wiki/enable_autotype 文摘如下: 一、添加autotype白名單 添加白名單有三種方式,三選一,如下: 1. 在代碼中配置ParserConfig.getGlobalInstance().addAc... ...
  • 前面已經對BeautifulSoup有了瞭解了,相信你基本已經學會怎麼獲取網頁數據了,那麼BeautifulSoup這麼弔,還有沒有其他的功能呢?當然是有的 前面說的Tag對象都還記得吧?像這樣BeautifulSoup.title,得到的就是Tag對象,它其實還有一些屬性: 1.contents: ...
  • 研究Web桌面應用開發有一段時間了,總結了Web桌面應用開發的一些主流方式。 一、前端Style 這種方式的就是直接實現一個Web程式,再封裝一個瀏覽器展示,相當粗暴和有效。著名的框架就是Electron和NW.js了。 代表應用程式是atom。 一般是基於node.js。也有其它語言的。 各種前端 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...