设计模式——抽象工厂模式

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

下面以一个公司的员工和部门在数据库中的访问模式来举例:
Tables:
    //用户类
    public 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 { public int id { get; set; } public string name { get; set; } }

客户端访问的接口:

//访问用户接口 interface IUser { void Insert(User user); //插入用户 User GetUser(int id); //获取用户 }

//访问部门接口 interface IDepartment { void Insert(Department department); Department GetDepartment(int id); }

在Access和SqlServer两个数据库中的访问操作:

//访问Access数据库的用户类 class AccessUser : IUser { public User GetUser(int id) { Console.WriteLine("从Access数据库中获取User!"); return null; } public void Insert(User user) { Console.WriteLine("在Access数据库中加入User!"); } }

//访问SqlServer数据库的类 class SqlserverUser : IUser { public User GetUser(int id) { Console.WriteLine("从Sql Server数据库中获取User!"); return null; } public void Insert(User user) { Console.WriteLine("在Sql Server数据库中加入User!"); } }

class AccessDepartment : IDepartment { public Department GetDepartment(int id) { Console.WriteLine("在Access中根据id获取Department表一条记录!"); return null; } public void Insert(Department department) { Console.WriteLine("在Access中给Department表增加一条记录!"); } }

class SqlserverDepartment : IDepartment { public Department GetDepartment(int id) { Console.WriteLine("在Sql Server中根据id获得Department表一条记录!"); return null; } public void Insert(Department department) { Console.WriteLine("在Sql Server中给Department表增加一条记录!"); } }


抽象工厂的实现:

//工厂接口,定义一个创建访问表对象的抽象的工厂接口 interface IFactory { IUser CreateUser(); IDepartment CreateDepartment(); }

//操作Access的工厂 class AccessFactory : IFactory { public IDepartment CreateDepartment() { return new AccessDepartment(); } public IUser CreateUser() { return new AccessUser(); } }

//操作SqlServer的工厂 class SqlServerFactory : IFactory { public IDepartment CreateDepartment() { return new SqlserverDepartment(); } public IUser CreateUser() { return new SqlserverUser(); } }

客户端程序代码:

class MainProgram { public void Main() { User user = new User(); IFactory factory = new SqlServerFactory(); //创建对应的工厂 IUser iu = factory.CreateUser(); //调用工厂方法 iu.Insert(user); iu.GetUser(user.ID); Console.ReadKey(); } }

抽象工厂模式的优点:1.易于交换产品系列,由于具体工厂类在应用中只需要在初始化的时候出现一次,这就使得改变一个应用中的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。2.它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中。缺点:如果需求是增加功能Func操作,那么需要增加多个类:Func信息类,访问接口类IFunc,Func的具体工厂类,还需要改动抽象工厂接口类等。
实际开发中,我们经常使用“
依赖注入”和“ 反射”来实现抽象工厂模式,可以去除switch和if条件判断带来的耦合。我们也经常使用到“ 反射+配置文件”的方式来实现。具体的实现思路不在这里细说了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值