【设计模式之抽象工厂】

前言:

最近在总结设计模式,再次看设计模式,理解又加深了不少!故来总结一下!

核心:

定义:

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.简要介绍一下本次的例子:创建sql和access工厂类,并创建访问sql server的user和department;访问access 的user和department

类图:

【设计模式之抽象工厂】_第1张图片

核心代码:

IFactory接口,定义一个创建访问User表的抽象的工厂接口
nterface IFactory
    {
        IUser CreateUser();
        IDepartment CreateDepartment();//增加接口的方法
    }
SqlServerFactory类,实现IFactory接口,实例化SqlserverUser
class SqlServerFactory :IFactory
    {
        public IUser CreateUser() { 
           return new SqlserverUser();
        }


        public IDepartment CreateDepartment()
        {
            return new SqlserverDepartment();
        }
    }
AccessFactory类,实现IFactory接口,实例化AccessUser
 class AccessFactory:IFactory
    {
        public IUser CreateUser() {
            return new AccessUser();
        }

        public IDepartment CreateDepartment()
        {
            return new AccessDepartment();
        }
    }
IUser接口,用于客户端访问,解除与具体数据库访问的耦合
interface IUser
    {
        void Insert(User user);
        User GetUser(int id);
    }
SqlserverUser类,用于访问SQL Server的User
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;
        }
    }
AccessUser类,,用于访问Access的User
class AccessUser:IUser
    {
        
            public void Insert(User user)
            {
                Console.WriteLine("在Access中给User表增加一条信息");
            }
            public User GetUser(int id)
            {
                Console.WriteLine("在Access中根据Id得到User表中的一条记录");
                return null;
            }
        }
User类:
class User
    {
        private int _id;

        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }
        private int _name;

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


以上利用抽象工厂创建了一个用户的接口,分别可以访问access数据库和sql server数据库,这样利用情形可以利用工厂方法可以结局,创建一个用户的工厂,抽象的工厂的用处在哪里呢?现在来了一个department,也要求可以访问两个数据库,那么怎么做呢?这时利用抽象工厂再创建一个department接口:
department类:
class Department
    {
        private int _id;

        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }
        private string _department;

        public string Department1
        {
            get { return _department; }
            set { _department = value; }
        }
    }

department接口:
interface IDepartment
    {
        void Insert(Department department);
        Department GetDepartment(int id);
    }
sqlServeDepartment类,用于访问SQL Server的Department
class SqlserverDepartment : IDepartment
    {
        public void Insert(Department department) {
            Console.WriteLine("在SQL Server中给Department表增加一条记录");        
        }
        public Department GetDepartment(int id) {
            Console.WriteLine("在SQL Server中根据ID得到deparment表中一条记录");
            return null;
        
        }
    }

AccessDepartment类,用于访问Access的Department
 class AccessDepartment :IDepartment
    {
        public void Insert(Department department)
        {
            Console.WriteLine("在Access中给Department表添加一条记录");
        }

        public Department GetDepartment(int id)
        {
            Console.WriteLine("在Access中根据id得到department表一条记录");
            return null;
        }
    }
客户端调用:
 static void Main(string[] args)
        {
            User user = new User();
            Department dept = new Department();

            IFactory factory = new SqlServerFactory();

            IUser iu = factory.CreateUser();

            iu.Insert(user);
            iu.GetUser(1);

            IDepartment id = factory.CreateDepartment();
            id.Insert(dept);
            id.GetDepartment(1);
            Console.Read();

        }

运行结果:

【设计模式之抽象工厂】_第2张图片

理解抽象工厂:

我们再次看看抽象工厂的定义,提供一个创建一系列相关或相互依赖对象的接口,在这个例子,指的是用户(User)和部门(Department)两个接口:    IUser CreateUser();              IDepartment CreateDepartment(); 没有指定具体的哪个用户或者哪个部门的对象.这就是抽象工厂的精髓所在.

总结:

后续阶段会持续总结设计模式,欢迎大家交流.

你可能感兴趣的:(●【架构设计】,———【设计模式】)