• 设计模式


    class User
    {
        int _id;
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }
    
        string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }
    
    interface IUser
    {
        void InsertUser(User user);
        User GetUser(int id);
    }    
    
    class SqlserverUser : IUser
    {
        public void InsertUser(User user)
        {
            Console.WriteLine("Insert into user by Sqlserver");
        }
    
        public User GetUser(int id)
        {
            Console.WriteLine("Get user by Sqlserver");
            return null;
        }
    }
    
    class AccessserverUser : IUser
    {
        public void InsertUser(User user)
        {
            Console.WriteLine("Insert into user by Accessserver");
        }
    
        public User GetUser(int id)
        {
            Console.WriteLine("Get user by Accessserver");
            return null;
        }
    }
    
    class Department
    {
        int _id;
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }
    
        string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }
    
    interface IDepartment
    {
        void InsertDepartment(Department department);
        Department GetDepartment(int id);
    }
    
    class SqlserverDepartment : IDepartment
    {
        public void InsertDepartment(Department department)
        {
            Console.WriteLine("Insert into Department by Sqlserver");
        }
    
        public Department GetDepartment(int id)
        {
            Console.WriteLine("Get Department by Sqlserver");
            return null;
        }
    }
    
    class AccessserverDepartment : IDepartment
    {
        public void InsertDepartment(Department department)
        {
            Console.WriteLine("Insert into Department by Accessserver");
        }
    
        public Department GetDepartment(int id)
        {
            Console.WriteLine("Get Department by Accessserver");
            return null;
        }
    }
    
    interface IFactoryDB
    {
        IUser CreateUser();
        IDepartment CreateDepartment();
    }
    
    class SqlserverFactory : IFactoryDB
    {
        public IUser CreateUser()
        {
            return new SqlserverUser();
        }
    
        public IDepartment CreateDepartment()
        {
            return new SqlserverDepartment();
        }
    }
    
    class AccessFactory : IFactoryDB
    {
        public IUser CreateUser()
        {
            return new AccessserverUser();
        }
    
        public IDepartment CreateDepartment()
        {
            return new AccessserverDepartment();
        }
    }   
    
    User user = new User() { Name = "Boy", Id = 1 };
    Department dp = new Department() { Name = "department", Id = 2 };
    IFactoryDB dbFactory = new AccessFactory();
    
    IUser iu = dbFactory.CreateUser();
    iu.InsertUser(user);
    iu.GetUser(user.Id);
    
    IDepartment idp = dbFactory.CreateDepartment();
    idp.InsertDepartment(dp);
    idp.GetDepartment(dp.Id);
    

    缺点:每增加一个表,就需要新增 3 个类的同时,
    修改 IFactory、SqlserverFactory、AccessFactory 类,
    这违法了开放-封闭原则。下面使用 DataAccess。

    class DataAccess
    {
        private static readonly string db = "Sqlserver";
        //private static readonly string db = "Access";
        //private static readonly string db = "Oracle";
    
        public static IUser CreateUser()
        {
            IUser result = null;
            switch (db)
            {
                case "Sqlserver":
                    result = new SqlserverUser();
                    break;
                case "Access":
                    result = new AccessserverUser();
                    break;                
            }
            return result;
        }
    
        public static IDepartment CreateDepartment()
        {
            IDepartment result = null;
            switch (db)
            {
                case "Sqlserver":
                    result = new SqlserverDepartment();
                    break;
                case "Access":
                    result = new AccessserverDepartment();
                    break;
            }
            return result;
        }
    }
    
    //业务代码:
    User user = new User() { Name = "Boy", Id = 1 };
    Department dp = new Department() { Name = "department", Id = 2 };
    
    IUser iu = DataAccess.CreateUser();
    iu.InsertUser(user);
    iu.GetUser(user.Id);
    
    IDepartment idp = DataAccess.CreateDepartment();
    idp.InsertDepartment(dp);
    idp.GetDepartment(dp.Id);
    

    缺点:如果这时候再加一个 Oracle 数据库,如果是原来的抽象工厂,只需要加一个 OracleFactory 就可以,现在每个方法的 switch 里面都得再加一个 case。因此采用反射技术:

    namespace WpfApp1.AbstractFactory {
    class DataAccess
    {
        private static readonly string AssemblyName = "WpfApp1";
        private static readonly string db = ConfigurationManager.AppSettings["DB"];
    
        public static IUser CreateUser()
        {
            string className = AssemblyName + ".AbstractFactory." + db + "User";
            return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
        }
    
        public static IDepartment CreateDepartment()
        {
            string className = AssemblyName + ".AbstractFactory." + db + "Department";
            return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
        }
    }
    
    // 业务代码:
    User user = new User() { Name = "Boy", Id = 1 };
    Department dp = new Department() { Name = "department", Id = 2 };
    
    IUser iu = DataAccess.CreateUser();
    iu.InsertUser(user);
    iu.GetUser(user.Id);
    
    IDepartment idp = DataAccess.CreateDepartment();
    idp.InsertDepartment(dp);
    idp.GetDepartment(dp.Id);            
    
  • 相关阅读:
    翻转单词顺序列
    和为S的两个数字
    单例模式
    python利用pyinstaller打包常用打包命令
    python 3.8 使用pymssql 向SQL Server插入数据不成功原因
    PyQt5(designer)入门教程
    PyQt5中文教程
    scrapy 图片爬取 多层多页 保存不同的文件夹 重命名full文件夹
    安装Python + PyCharm + PyQt5配套设置
    python用pymysql模块操作数据库MySQL,实现查增删改
  • 原文地址:https://www.cnblogs.com/MichaelLoveSna/p/14198975.html
Copyright © 2020-2023  润新知