工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。但是在实际的应用中,一个工厂不止会创建单一的产品,而是一系列的产品,这就引入了抽象工厂的概念。解决涉及多个产品系列的问题。
大家都知道利用抽象工厂模式可以切换数据库的访问,那具体怎么做呢?
这里介绍两种方式:利用简单工厂改进传统的抽象工厂;利用反射的方式
一、通过简单工厂改进的抽象工厂
有2张表
create table User ( ID int primary key, Name nvarchar(50) ) create table Department ( ID int primary key, DeptName nvarchar(50) )
在model层建立2个类
class Department { public int ID { get; set; } public string DeptName { get; set; } } class User { public int ID { get; set; } public string Name { get; set; } }
建立2个接口类库
interface IUser { void Insert(User user); User GetUser(int id); } interface IDepartment { void Insert(Department department); Department GetDepartment(int id); }
然后针对不同的实现建立具体的类
class MysqlUser:IUser { public void Insert(User user) { } public User GetUser(int id) { return null; } } class SqlServerUser:IUser { public void Insert(User user) { //插入操作 } public User GetUser(int id) { return null; } }
class MysqlDepartment:IDepartment { public void Insert(Department department) { //插入操作 } public Department GetDepartment(int id) { //对应数据库的代码 return null; } } class SqlServerDepartment:IDepartment { public void Insert(Department department) { } public Department GetDepartment(int id) { return null; } }
然后通过一个简单工厂实例化不同的类
class DataBaseAll { private static readonly string db = "Mysql"; public static IUser CreateUser() { IUser result = null; switch(db) { case "Mysql": result = new MysqlUser(); break; case "SqlServer": result = new SqlServerUser(); break; } return result; } public static IDepartment CreateDepartment() { IDepartment result = null; switch (db) { case "Mysql": result = new MysqlDepartment(); break; case "SqlServer": result = new SqlServerDepartment(); break; } return result; } }