• 设计模式 抽象工厂模式


    抽象工厂模式(Abstract Factory)的定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

    可见,抽象工厂模式是指当有多个抽象角色时,使用的一种工厂方法模式。工厂方法模式是针对一个产品等级结构,而抽象工厂是针对多个产品等级结构。

        class User
        {
            private int _id;
            public int ID
            {
                get { return _id; }
                set { _id = value; }
            }
    
            private string _name;
            public string Name
            {
                get { return _name; }
                set { _name = value; }
            }
        }
    
        class Department
        {
            private int _id;
            public int ID
            {
                get { return _id; }
                set { _id = value; }
            }
    
            private string _deptName;
            public string DeptName
            {
                get { return _deptName; }
                set { _deptName = value; }
            }
        }
    
        interface IUser
        {
            void Insert(User user);
    
            User GetUser(int id);
        }
    
        interface IDepartment
        {
            void Insert(Department department);
    
            Department GetDepartment(int id);
        }
    抽象产品
        /// <summary>
        /// 具体产品A1 
        /// </summary>
        class SqlserverUser : IUser
        {
            public void Insert(User user)
            {
                Console.WriteLine("在Sqlserver中给User表增加一条记录");
            }
    
            public User GetUser(int id)
            {
                Console.WriteLine("在Sqlserver中根据ID得到User表一条记录");
                return null;
            }
        }
    
        /// <summary>
        /// 具体产品B1
        /// </summary>
        class AccessUser : IUser
        {
            public void Insert(User user)
            {
                Console.WriteLine("在Access中给User表增加一条记录");
            }
    
            public User GetUser(int id)
            {
                Console.WriteLine("在Access中根据ID得到User表一条记录");
                return null;
            }
        }
    
        /// <summary>
        /// 具体产品A2
        /// </summary>
        class SqlserverDepartment : IDepartment
        {
            public void Insert(Department department)
            {
                Console.WriteLine("在Sqlserver中给Department表增加一条记录");
            }
    
            public Department GetDepartment(int id)
            {
                Console.WriteLine("在Sqlserver中根据ID得到Department表一条记录");
                return null;
            }
        }
    
        /// <summary>
        /// 具体产品B2
        /// </summary>
        class AccessDepartment : IDepartment
        {
            public void Insert(Department department)
            {
                Console.WriteLine("在Access中给Department表增加一条记录");
            }
    
            public Department GetDepartment(int id)
            {
                Console.WriteLine("在Access中根据ID得到Department表一条记录");
                return null;
            }
        }
    具体产品
        /// <summary>
        /// 抽象工厂
        /// </summary>
        interface IFactory
        {
            IUser CreateUser();
    
            IDepartment CreateDepartment();
        }
    抽象工厂
        class SqlServerFactory : IFactory
        {
            public IUser CreateUser()
            {
                return new SqlserverUser();
            }
    
            public IDepartment CreateDepartment()
            {
                return new SqlserverDepartment();
            }
        }
    
        class AccessFactory : IFactory
        {
            public IUser CreateUser()
            {
                return new AccessUser();
            }
    
            public IDepartment CreateDepartment()
            {
                return new AccessDepartment();
            }
        }
    具体工厂
            static void Main(string[] args)
            {
                User user = new User();
                Department dept = new Department();
    
                //AbstractFactory factory = new SqlServerFactory();
                IFactory factory = new AccessFactory();
                IUser iu = factory.CreateUser();
    
                iu.Insert(user);
                iu.GetUser(1);
    
                IDepartment id = factory.CreateDepartment();
                id.Insert(dept);
                id.GetDepartment(1);
            }
    抽象工厂模式的实现

     抽象工厂的优点:分离了具体的类,易于交换产品系列。缺点:难以支持新的产品。

    用简单工厂模式改进抽象工厂

        class DataAccess
        {
            private static readonly string db = "Sqlserver";
            //private static readonly string db = "Access";
    
            public static IUser CreateUser()
            {
                IUser result = null;
                switch (db)
                {
                    case "Sqlserver":
                        result = new SqlserverUser();
                        break;
                    case "Access":
                        result = new AccessUser();
                        break;
                }
                return result;
            }
    
            public static IDepartment CreateDepartment()
            {
                IDepartment result = null;
                switch (db)
                {
                    case "Sqlserver":
                        result = new SqlserverDepartment();
                        break;
                    case "Access":
                        result = new AccessDepartment();
                        break;
                }
                return result;
            }
        }
    

    反射+抽象模式

    反射:Assembly.load("程序集名称").CreateInstance("命名空间.类名称")

        class DataAccess
        {
            private static readonly string AssemblyName = "抽象工厂模式";
            private static readonly string db = "Sqlserver";
            //private static readonly string db = "Access";
    
            public static IUser CreateUser()
            {
                string className = AssemblyName + "." + db + "User";
                return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
            }
    
            public static IDepartment CreateDepartment()
            {
                string className = AssemblyName + "." + db + "Department";
                return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
            }
        }
    

    注:以上部分参考自《大话设计模式》。

      

  • 相关阅读:
    【学习笔记/题解】树上启发式合并/CF600E Lomsat gelral
    【学习笔记/题解】虚树/[SDOI2011]消耗战
    【题解】 [GZOI2017]小z玩游戏
    【题解】CF1426E Rock, Paper, Scissors
    【题解】CF1426D Non-zero Segments
    【题解】NOIP2018 填数游戏
    【题解】NOIP2018 旅行
    【题解】NOIP2018 赛道修建
    【题解】时间复杂度
    【题解】「MCOI-02」Convex Hull 凸包
  • 原文地址:https://www.cnblogs.com/YuanSong/p/4162263.html
Copyright © 2020-2023  润新知