不得不懂的C#设计模式学习(三)-抽象工厂模式

直接进入Subject.

抽象工厂模式(Abstract Factory)

   提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

四个角色

   抽象工厂(Abstract Factory)角色:这是工厂方法模式的核心,它与应用系统商业逻辑无关。

   具体工厂(Concrete Factory)角色:直接在客户端的调用下创建具体的实例。包含了选择合适的具体对象,而这个逻辑与应用系统的商业逻辑紧密相关。

   抽象产品(Abstract Product)角色:工厂方法模式所创建的对象的父类,或它们直接拥有的接口。

   具体产品(Concrete Product)角色:代表具体的产品。

例子

   留一个问题,看完例子给出UML图(可以贴出)。

 public class User    //增加User用户类
    {
        public int _id;
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        public string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }

    public class Department //增加部门Department类
    {
        private int _id;
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        private string _deptNmae;
        public string DeptName
        {
            get { return _deptNmae; }
            set { _deptNmae = value; }
        }

    }

    interface IUser
    {
        void Insert(User user);
        User GetUser(int id);
    }

    class SqlserverUser : IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("在SQL Server中给User表增加了一条记录");
        }

        public User GetUser(int id)
        {
            Console.WriteLine("在SQL Server中根据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("在SQL Server中给Department表增加了一条记录");
        }

        public Department GetDepartment(int id)
        {
            Console.WriteLine("在SQL Server中根据id得到了Department表的一条记录");
            return null;
        }
    }

    class AccessDepartment : IDepartment
    {
        public void Insert(Department department)
        {
            Console.WriteLine("在Accessz中给Department表增加了一条记录");
        }

        public Department GetDepartment(int id)
        {
            Console.WriteLine("在Access中根据id得到了Department表的一条记录");
            return null;
        }
    }

    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 dpt = new Department();

            IFactory facatory = new AccessFactory();
            IUser iu = facatory.CreateUser();
            iu.Insert(user);
            iu.GetUser(1);

            IDepartment id = facatory.CreateDepartment();
            id.Insert(dpt);
            id.GetDepartment(1);

            Console.ReadKey();
        }

总结

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,运用抽象工厂模式的关键点在于应对"多系列对象创建"的需求变化,学会了抽象工厂模式,你将理解OOP的精华:面向接口对象。

    

posted @ 2013-04-11 08:59  春雨清泉  阅读(2296)  评论(0编辑  收藏  举报