美文网首页学习设计模式
11,抽象工厂模式(Abstract Factory)

11,抽象工厂模式(Abstract Factory)

作者: Kenny丶Mo | 来源:发表于2017-10-08 17:36 被阅读6次

    1,定义

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

    2,UML图

    3,基本代码

    namespace 抽象工厂模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                AbstractFactory factory1 = new ConcreteFactory1();
                Client c1 = new Client(factory1);
                c1.Run();
    
                AbstractFactory factory2 = new ConcreteFactory2();
                Client c2 = new Client(factory2);
                c2.Run();
    
                Console.Read();
    
            }
        }
    
        abstract class AbstractFactory
        {
            public abstract AbstractProductA CreateProductA();
            public abstract AbstractProductB CreateProductB();
        }
    
        class ConcreteFactory1 : AbstractFactory
        {
            public override AbstractProductA CreateProductA()
            {
                return new ProductA1();
            }
            public override AbstractProductB CreateProductB()
            {
                return new ProductB1();
            }
        }
    
        class ConcreteFactory2 : AbstractFactory
        {
            public override AbstractProductA CreateProductA()
            {
                return new ProductA2();
            }
            public override AbstractProductB CreateProductB()
            {
                return new ProductB2();
            }
        }
        abstract class AbstractProductA
        {
        }
    
        abstract class AbstractProductB
        {
            public abstract void Interact(AbstractProductA a);
        }
    
        class ProductA1 : AbstractProductA
        {
        }
    
        class ProductB1 : AbstractProductB
        {
            public override void Interact(AbstractProductA a)
            {
                Console.WriteLine(this.GetType().Name +
                  " interacts with " + a.GetType().Name);
            }
        }
    
        class ProductA2 : AbstractProductA
        {
        }
    
        class ProductB2 : AbstractProductB
        {
            public override void Interact(AbstractProductA a)
            {
                Console.WriteLine(this.GetType().Name +
                  " interacts with " + a.GetType().Name);
            }
        }
    
        class Client
        {
            private AbstractProductA AbstractProductA;
            private AbstractProductB AbstractProductB;
    
            // Constructor 
            public Client(AbstractFactory factory)
            {
                AbstractProductB = factory.CreateProductB();
                AbstractProductA = factory.CreateProductA();
            }
    
            public void Run()
            {
                AbstractProductB.Interact(AbstractProductA);
            }
        }
    
    
    }
    
    

    4,抽象工厂模式的改进(基于反射和配置文件)

    namespace 抽象工厂模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                User user = new User();
                Department dept = new Department();
    
                IUser iu = DataAccess.CreateUser();
    
                iu.Insert(user);
                iu.GetUser(1);
    
                IDepartment id = DataAccess.CreateDepartment();
                id.Insert(dept);
                id.GetDepartment(1);
    
                Console.Read();
            }
        }
    
        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);
        }
    
        class SqlserverUser : IUser
        {
            public void Insert(User user)
            {
                Console.WriteLine("在Sqlserver中给User表增加一条记录");
            }
    
            public User GetUser(int id)
            {
                Console.WriteLine("在Sqlserver中根据ID得到User表一条记录");
                return null;
            }
        }
    
        class AccessUser : IUser
        {
            public void Insert(User user)
            {
                Console.WriteLine("在Access中给User表增加一条记录");
            }
    
            public User GetUser(int id)
            {
                Console.WriteLine("在Access中根据ID得到User表一条记录");
                return null;
            }
        }
    
        interface IDepartment
        {
            void Insert(Department department);
    
            Department GetDepartment(int id);
        }
    
        class SqlserverDepartment : IDepartment
        {
            public void Insert(Department department)
            {
                Console.WriteLine("在Sqlserver中给Department表增加一条记录");
            }
    
            public Department GetDepartment(int id)
            {
                Console.WriteLine("在Sqlserver中根据ID得到Department表一条记录");
                return null;
            }
        }
    
        class AccessDepartment : IDepartment
        {
            public void Insert(Department department)
            {
                Console.WriteLine("在Access中给Department表增加一条记录");
            }
    
            public Department GetDepartment(int id)
            {
                Console.WriteLine("在Access中根据ID得到Department表一条记录");
                return null;
            }
        }
    
        class DataAccess
        {
            private static readonly string AssemblyName = "抽象工厂模式";
            private static readonly string db = ConfigurationManager.AppSettings["DB"];
            
            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);
            }
        }
    
    }
    

    相关文章

      网友评论

        本文标题:11,抽象工厂模式(Abstract Factory)

        本文链接:https://www.haomeiwen.com/subject/amqyyxtx.html