抽象工厂模式实现不同数据库(ACCess、SQL)实现用户跟部门操作,用反射的方式切换
抽象工厂模式实现不同数据库(ACCess、SQL)实现用户和部门操作,用反射的方式切换
1.用vs2013建模如果
自动生成代码
用户和部门实体
用户操作契约:
部门操作契约(接口)
部门ACCESS操作的实现
用户ACCESS操作实现类
部门SQL操作类实现
用户操作SQL数据实现
反射方式获得实现
调用
意图:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用性:
1.一个系统要独立于它的产品的创建、组合和表示时.
2.一个系统要由多个产品系列中的一个来配置时.
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4.当你提供一个产品类库,而只想显示它们的接口而不是实现时。
1.用vs2013建模如果
自动生成代码
用户和部门实体
//------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool // Changes to this file will be lost if the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace AbractFactory { using System; using System.Collections.Generic; using System.Linq; using System.Text; public class Department { public virtual int ID { get; set; } public virtual string DepartmentName { get; set; } } } //------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool // Changes to this file will be lost if the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace AbractFactory { using System; using System.Collections.Generic; using System.Linq; using System.Text; public class User { public virtual int ID { get; set; } public virtual string UserName { get; set; } } }
用户操作契约:
//------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool // Changes to this file will be lost if the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace AbractFactory { using System; using System.Collections.Generic; using System.Linq; using System.Text; public interface IUser { void InsertUser(User user); User GetUser(int id); } }
部门操作契约(接口)
//------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool // Changes to this file will be lost if the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace AbractFactory { using System; using System.Collections.Generic; using System.Linq; using System.Text; public interface IDepartment { void InsertDepartment(string departmentName); Department GetDepartment(int id); } }
部门ACCESS操作的实现
//------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool // Changes to this file will be lost if the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace AbractFactory { using System; using System.Collections.Generic; using System.Linq; using System.Text; public class AccessDepartment : IDepartment { public void Insert(Department department) { Console.WriteLine("在Access中给Department表增加一条记录"); } public Department GetDepartment(int id) { Console.WriteLine("在Access中根据ID得到Department表一条记录"); return null; } } }
用户ACCESS操作实现类
//------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool // Changes to this file will be lost if the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace AbractFactory { using System; using System.Collections.Generic; using System.Linq; using System.Text; class AccessUser : IUser { public void Insert(User user) { Console.WriteLine("在Access中给User表增加一条记录"); } public User GetUser(int id) { Console.WriteLine("在Access中根据ID得到User表一条记录"); return null; } } }
部门SQL操作类实现
//------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool // Changes to this file will be lost if the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace AbractFactory { using System; using System.Collections.Generic; using System.Linq; using System.Text; public class SqlserverDepartment : IDepartment { public void Insert(Department department) { Console.WriteLine("在Sqlserver中给Department表增加一条记录"); } public Department GetDepartment(int id) { Console.WriteLine("在Sqlserver中根据ID得到Department表一条记录"); return null; } } }
用户操作SQL数据实现
//------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool // Changes to this file will be lost if the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace AbractFactory { using System; using System.Collections.Generic; using System.Linq; using System.Text; public class SqlserverUser : IUser { public virtual void InsertUser(User user) { throw new System.NotImplementedException(); } public virtual User GetUser(int id) { throw new System.NotImplementedException(); } } }
反射方式获得实现
//------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool // Changes to this file will be lost if the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace AbractFactory { using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Reflection; using System.Text; public class DataAccess { private static readonly string AssemblyName = "抽象工厂模式"; private static readonly string db = ConfigurationManager.AppSettings["DB"]; public virtual IDepartment IDepartment { get; set; } public virtual IUser IUser { get; set; } public virtual void CreateUser() { string className = AssemblyName + "." + db + "User"; IUser= (IUser)Assembly.Load(AssemblyName).CreateInstance(className); } public virtual void CreateDepartment() { string className = AssemblyName + "." + db + "Department"; IDepartment= (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className); } } }
调用
using AbractFactory; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DesginPatternLib.GeneratedCode { class Class1 { static void Main(string[] args) { User user = new User(); Department dept = new Department(); DataAccess da = new DataAccess(); IUser iu = da.IUser; iu.InsertUser(user); iu.GetUser(1); IDepartment id = da.IDepartment; id.InsertDepartment(dept); id.GetDepartment(1); Console.Read(); } } }
意图:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用性:
1.一个系统要独立于它的产品的创建、组合和表示时.
2.一个系统要由多个产品系列中的一个来配置时.
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4.当你提供一个产品类库,而只想显示它们的接口而不是实现时。