C#设计模式-抽象工厂

抽象工厂模式的学习体会到了类与类之间的解耦重要性,并且类与类之间的联系也因为解耦看着更加的简洁易懂,首先先了解到抽象工厂的定义是什么:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式,是工厂方法模式的升级版,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

对于应用我也只是简单的看着那些例子来的,但是就是这些例子特别的简洁,易懂所以就用所学的这个对于数据库访问与修改的小例子来进行一个小展示,如有不足之处还请告知,感谢各位。

第一步:创建三个接口用于客户端的访问,解除与具体的类之间的耦合 

 

//定义一个创建访问Department表对象的抽象的工厂接口
    interface IFactory
    {
        IUser CreteUser();

        IDepartment CreateDepartment();
    }


    interface IUser
    {
        void Insert(User user);

        User GetUser(int id);
    }

 //用于客户端访问,解除与具体数据库访问的耦合
    interface IDepartment
    {
        void Insert(Department department);

        Department GetDepartment(int id);
    }

第二步: 创建对应的类来实现这个三个接口

//实现IFactory接口,实例化AccessUser和AccessDepartment
    class AccessFactory:IFactory
    {
        public IUser CreteUser()
        {
            return new AccessUser();
        }


        public IDepartment CreateDepartment()
        {
            return new AccessDepartment();
        }
    }

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

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


//实现IFactory接口,实例化SqlserverUser和SqlserverDepartment
    class SqlServerFactory:IFactory
    {
        public IUser CreteUser()
        {
            return new SqlServerUser();

        }
        
        public IDepartment CreateDepartment()
        {
            return new SqlserverDepartment();
        }
    }


 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;
        }
    }

其余类代码 

//用于访问SQLsever的Department
    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;
        }
    }

  //用于访问Access的Dempartment
    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 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; }
        }
    }

Department与User类相似

客户端代码 

 class Program
    {
        static void Main(string[] args)
        {
            User user = new User();
            Department dept = new Department();

            IFactory factory = new AccessFactory();
            //IFactory factory = new SqlServerFactory();
            IUser iu = factory.CreteUser();

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

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

            Console.Read();
        }
    }

 

 

因为通过这三个接口的作用,我们客户端也不需要去了解到具体是哪个数据库的就可以直接进行访问,这也就是抽象工厂的最主要的能力,只需要提供一个创建好的接口就不需要指定具体的类就可以了,其实你会发现在我们学习的那些模式当中都在围绕着解耦、封装、易维护这些需求来的,而且越往后这些模式的功能就更加的人性化,在生活中这些模式其实也是随处可见的,把这些带进生活更加的容易理解,自己现在理解的也就这点了,如有不足之处还请指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮卡冲撞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值