设计模式之抽象工厂模式
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
最大的好处便是易于交换产品系列,由于具体工厂类,在一个应用中只需在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需改变具体工厂即可使用不同的产品配置。
他使具体创建实例的过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离。
下面的代码还使用了反射与XML.
代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.Configuration; namespace 设计模式之抽象工厂模式2 { class Deparentment{ } interface IDepartment { void Insert(Deparentment department); Deparentment GetDepartment(); } class SqlserverDepartment : IDepartment { public void Insert(Deparentment deparent) { Console.WriteLine("在SQL中为deparent表增加了一条记录"); } public Deparentment GetDepartment() { Console.WriteLine("从SQL中的deparent表中取出了一条记录"); return new Deparentment(); } } class AccessDeparent:IDepartment { public void Insert(Deparentment deparent) { Console.WriteLine("在Access中为deparent表增加了一条记录"); } public Deparentment GetDepartment() { Console.WriteLine("从Access中的deparent表中取出了一条记录"); return new Deparentment(); } } class User { } interface IUser { void Insert(User u); User GetUser(); } class SqlUser:IUser { public void Insert(User u) { Console.WriteLine("在Sql中向User表中添加了一条记录"); } public User GetUser() { Console.WriteLine("从SQL中的User表中取出了一条记录"); return new User(); } } class AccessUser:IUser { public void Insert(User u) { Console.WriteLine("在Accesss中向User表中添加了一条记录"); } public User GetUser() { Console.WriteLine("从Access中的User表中取出了一条记录"); return new User(); } } class DataAccess { private static readonly string AssemblyName = "设计模式之抽象工厂模式2"; private static readonly string db = ConfigurationManager.AppSettings["DB"]; public static IUser CreateUser() { string className = AssemblyName + "." + db + "User"; return (IUser)Assembly.Load(AssemblyName).CreateInstance(className); } public static IDepartment CreateDeparent() { string className = AssemblyName + "." + db + "Department"; return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className); } } class Program { static void Main(string[] args) { User user = new User(); Deparentment dept = new Deparentment(); IUser iu = DataAccess.CreateUser(); iu.Insert(user); iu.GetUser(); Console.Read(); } } }
XML文件:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <appSettings> <add key="DB" value="Access"/> </appSettings> </configuration>
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话