工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。但是在实际的应用中,一个工厂不止会创建单一的产品,而是一系列的产品,这就引入了抽象工厂的概念。解决涉及多个产品系列的问题。

大家都知道利用抽象工厂模式可以切换数据库的访问,那具体怎么做呢?
这里介绍两种方式:利用简单工厂改进传统的抽象工厂;利用反射的方式

一、通过简单工厂改进的抽象工厂

设计模式之-抽象工厂_sql

 

 

 

 

 

有2张表

设计模式之-抽象工厂_sql_02设计模式之-抽象工厂_ide_03
  create table User
  (
   ID int primary key,
   Name nvarchar(50)   
  )
  create table Department
  (
   ID int primary key,
   DeptName nvarchar(50)   
  )
View Code

在model层建立2个类

设计模式之-抽象工厂_sql_02设计模式之-抽象工厂_ide_03
    class Department
    {
        public int ID { get; set; }
        public string DeptName { get; set; }
    }
    class User
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
    
View Code

建立2个接口类库

设计模式之-抽象工厂_sql_02设计模式之-抽象工厂_ide_03
    interface IUser
    {
        void Insert(User user);
        User GetUser(int id);
    }
    interface IDepartment
    {
        void Insert(Department department);
        Department GetDepartment(int id);
    }
View Code

然后针对不同的实现建立具体的类

设计模式之-抽象工厂_sql_02设计模式之-抽象工厂_ide_03
   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;
        }
    }
View Code
设计模式之-抽象工厂_sql_02设计模式之-抽象工厂_ide_03
    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;
        }
    }
View Code

然后通过一个简单工厂实例化不同的类

设计模式之-抽象工厂_sql_02设计模式之-抽象工厂_ide_03
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;
        }
    }
View Code