zoukankan      html  css  js  c++  java
  • 设计模式

    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);            
    
  • 相关阅读:
    (转)位置无关码、位置有关码
    【转载】PM为什么会存在?怎么存在?
    战略是什么?3-互联网产品行业以及竞争对手分析
    【转载】2014,要格外留意这7大投资机会——哈继铭 {key:人口红利、房价、社会结构、贸易逆差}
    2014年书单-30本
    产品经理要树立战略意识——战略是什么2(谈国家限制支付宝的战略分析)
    产品经理要树立战略意识——战略是什么1
    【转载】产品经理入门案例分析——锤子手机策略
    javascript设计模式-工厂模式
    javascript设计模式-单例模式
  • 原文地址:https://www.cnblogs.com/MichaelLoveSna/p/14198975.html
Copyright © 2011-2022 走看看