題目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