[学习笔记]工厂方法用于数据库开发
摘自《大话设计模式》一书。
程序入口:
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Reflection;
5 using System.Configuration;
6
7 namespace 抽象工厂模式
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 User user = new User();
14 Department dept = new Department();
15
16 IUser iu = DataAccess.CreateUser();
17
18 iu.Insert(user);
19 iu.GetUser(1);
20
21 IDepartment id = DataAccess.CreateDepartment();
22 id.Insert(dept);
23 id.GetDepartment(1);
24
25 Console.Read();
26 }
27 }
28 }
工厂方法:
1 class DataAccess
2 {
3 private static readonly string AssemblyName = "抽象工厂模式";
4 private static readonly string db = ConfigurationManager.AppSettings["DB"];
5
6 public static IUser CreateUser()
7 {
8 string className = AssemblyName + "." + db + "User";
9 return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
10 }
11
12 public static IDepartment CreateDepartment()
13 {
14 string className = AssemblyName + "." + db + "Department";
15 return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
16 }
17 }
数据实体类User和Department:
1 class User
2 {
3 private int _id;
4 public int ID
5 {
6 get { return _id; }
7 set { _id = value; }
8 }
9
10 private string _name;
11 public string Name
12 {
13 get { return _name; }
14 set { _name = value; }
15 }
16 }
1 class Department
2 {
3 private int _id;
4 public int ID
5 {
6 get { return _id; }
7 set { _id = value; }
8 }
9
10 private string _deptName;
11 public string DeptName
12 {
13 get { return _deptName; }
14 set { _deptName = value; }
15 }
16 }
数据操作:
1 interface IUser
2 {
3 void Insert(User user);
4
5 User GetUser(int id);
6 }
1 class SqlserverUser : IUser
2 {
3 public void Insert(User user)
4 {
5 Console.WriteLine("在Sqlserver中给User表增加一条记录");
6 }
7
8 public User GetUser(int id)
9 {
10 Console.WriteLine("在Sqlserver中根据ID得到User表一条记录");
11 return null;
12 }
13 }
1 class AccessUser : IUser
2 {
3 public void Insert(User user)
4 {
5 Console.WriteLine("在Access中给User表增加一条记录");
6 }
7
8 public User GetUser(int id)
9 {
10 Console.WriteLine("在Access中根据ID得到User表一条记录");
11 return null;
12 }
13 }
1 interface IDepartment
2 {
3 void Insert(Department department);
4
5 Department GetDepartment(int id);
6 }
1 class SqlserverDepartment : IDepartment
2 {
3 public void Insert(Department department)
4 {
5 Console.WriteLine("在Sqlserver中给Department表增加一条记录");
6 }
7
8 public Department GetDepartment(int id)
9 {
10 Console.WriteLine("在Sqlserver中根据ID得到Department表一条记录");
11 return null;
12 }
13 }
1 class AccessDepartment : IDepartment
2 {
3 public void Insert(Department department)
4 {
5 Console.WriteLine("在Access中给Department表增加一条记录");
6 }
7
8 public Department GetDepartment(int id)
9 {
10 Console.WriteLine("在Access中根据ID得到Department表一条记录");
11 return null;
12 }
13 }
以前总是把IUser接口这样的操作也写到数据库视图中,老是感觉不和谐。从抽象的角度看,数据库操作并不是实体User的必须方法,而且我也不是什么时候都需要调用数据的,如果把实体中增加了数据库操作方法,调用者恶意调用多麻烦!这里再分一个抽象的IUser专门管理数据库操作还是很好的。
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用
2012-02-21 Oracle10g安装及监听问题处理