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);            
    
  • 相关阅读:
    《HTTP权威指南》之HTTP连接管理及对TCP性能的考虑
    TCP/ip
    java scoket http TCP udp
    java ==和equals区别
    Java 流
    android ViewPager,ViewFlipper,ViewFlow实现左右滑动
    java反射详解
    退出清理所有Activity方法
    Android UI 使用Merge,include和 ViewStub--优化(1)
    android resources使用总结
  • 原文地址:https://www.cnblogs.com/MichaelLoveSna/p/14198975.html
Copyright © 2011-2022 走看看