抽象工厂更换数据库案例

引言

我们在日常的开发中,有可能会触发一种极端的情况,我们甲方是那种大客户,我们之前用的是sqlserver数据库,现在甲方必须让我们使用mysql,或者让我们换别的。为此我们使用抽象工厂来操作一下不同角色的更换数据库。

铺垫

我们需要先写一个user类,再写一个sqlserver操作类,我们模拟三个角色来完成对数据库的更换

刚入行的小白,二年工作经验的大白,五年经验的老手

  public class User
  {
      public int Id { get; set; }  
      public string Name { get; set; }    
  }

  public class SqlServerUser
  {
      public void InsertUser(User user)
      {
          Console.WriteLine(  "插入了用户:"+user.Name);
      }
      public User  getUser(int ID) 
      {
          Console.WriteLine("获取了客户:"+ID);
          return null;
      }

  }

入行的小白

static void Main(string[] args)
{
    User user = new User();
    user.Name = "test";
    user.Id = 1;    
    SqlServerUser sqlServerUser=new SqlServerUser();
    sqlServerUser.InsertUser(user);
    sqlServerUser.getUser(user.Id);    
}

这种方法是不可取的,我们不应该这么写死。不灵活,也不易于扩展。

二年的大白

学了设计模式后,会运用设计模式去做这件事情(抽象工厂设计模式)

  static void Main(string[] args)
  {
      User user = new User();
      user.Name = "test";
      user.Id = 1;

      IFactrol factrol = new SqlserverFactoryUser();

      IDatabaseUser databaseUser= factrol.GetDatabaseUser();
      databaseUser.InsertUser(user);
      databaseUser.GetUser(user.Id);
  }

  public class User
  {
      public int Id { get; set; }  
      public string Name { get; set; }    
  }

  public interface IDatabaseUser
  {
      void InsertUser(User user);
      User GetUser(int id);
  }

  public class SqlServerUser:IDatabaseUser
  {
      public void InsertUser(User user)
      {
          Console.WriteLine("sqlserver插入了用户:"+user.Name);
      }
      public User GetUser(int id) 
      {
          Console.WriteLine("sqlserver获取了客户:"+id);
          return null;
      }

  }

  public class MySqlUser : IDatabaseUser
  {
      public void InsertUser(User user)
      {
          Console.WriteLine("MySql插入了用户:" + user.Name);
      }
      public User GetUser(int id)
      {
          Console.WriteLine("MySql获取了客户:" + id);
          return null;
      }
  }

  public interface IFactrol
  {
      IDatabaseUser GetDatabaseUser();
  }

  public class SqlserverFactoryUser:IFactrol
  {
      public IDatabaseUser GetDatabaseUser()
      {
          return new SqlServerUser(); 
      }
  }
  public class MySqlFactoryUser : IFactrol
  {
      public IDatabaseUser GetDatabaseUser()
      {
          return new MySqlUser();
      }
  }

这里我们添加了接口,让我们的类继承这个接口,实现接口里面的方法,再添加每个数据库的工厂。在工厂里面返回我所需要的数据库对象,以后我们在换数据库的时候我们只需要更换调用工厂的那句话:IFactrol factrol = new SqlserverFactoryUser();

更换为Mysql

IFactrol factrol = new MySqlFactoryUser();

我们只需要替换一句话,后面的不动就已经完成了数据库的更换。当然两年的程序员可能会考虑不周,未来我们需要添加更多的表,如果我们这么写,就要创建很多的子类的方法,让我们的工厂更冗余,因为我们需要添加新表的接口,再去每个对象继承这个接口,

五年的老手

 static void Main(string[] args)
 {
     User user = new User();
     user.Name = "test";
     user.Id = 1;

     IFactrol factrol = new MySqlFactoryUser();

     IDatabaseUser databaseUser= factrol.GetDatabaseUser();
     databaseUser.InsertUser(user);
     databaseUser.GetUser(user.Id);

     DemPertment de = new DemPertment();
     de.DemName = "开发部";
     de.Id = 2;

     IDatabaseDempettMnet databaseDempettMnet = factrol.GetDempettMnet();
     databaseDempettMnet.InsertDemPertment(de);
     databaseDempettMnet.GetDemPertment(de.Id);
 }

 public class User
 {
     public int Id { get; set; }  
     public string Name { get; set; }    
 }

 public class DemPertment
 {
     public int Id { get; set; }
     public string DemName { get; set; }
 }

 public interface IDatabaseUser
 {
     void InsertUser(User user);
     User GetUser(int id);
 }

 public class SqlServerUser : IDatabaseUser
 {
     public void InsertUser(User user)
     {
         Console.WriteLine("sqlserver插入了用户:" + user.Name);
     }
     public User GetUser(int id)
     {
         Console.WriteLine("sqlserver获取了客户:" + id);
         return null;
     }

 }

 public class MySqlUser : IDatabaseUser
 {
     public void InsertUser(User user)
     {
         Console.WriteLine("MySql插入了用户:" + user.Name);
     }
     public User GetUser(int id)
     {
         Console.WriteLine("MySql获取了客户:" + id);
         return null;
     }
 }

 public interface IDatabaseDempettMnet
 {
     void InsertDemPertment(DemPertment user);
     DemPertment GetDemPertment(int id);
 }

 public class SqlServerDem : IDatabaseDempettMnet
 {
     public void InsertDemPertment(DemPertment user)
     {
         Console.WriteLine("sqlserver插入了部门:" + user.DemName);
     }
     public DemPertment GetDemPertment(int id)
     {
         Console.WriteLine("sqlserver获取了部门:" + id);
         return null;
     }

 }

 public class MySqlDem : IDatabaseDempettMnet
 {
     public void InsertDemPertment(DemPertment user)
     {
         Console.WriteLine("MySql插入了部门:" + user.DemName);
     }
     public DemPertment GetDemPertment(int id)
     {
         Console.WriteLine("MySql获取了部门:" + id);
         return null;
     }
 }




 public interface IFactrol
 {
     IDatabaseUser GetDatabaseUser();
     IDatabaseDempettMnet GetDempettMnet();  
 }

 public class SqlserverFactoryUser : IFactrol
 {
     public IDatabaseUser GetDatabaseUser()
     {
         return new SqlServerUser(); 
     }

     public IDatabaseDempettMnet GetDempettMnet()
     {
         return new SqlServerDem();
     }
 }
 public class MySqlFactoryUser : IFactrol
 {
     public IDatabaseUser GetDatabaseUser()
     {
         return new MySqlUser();
     }
     public IDatabaseDempettMnet GetDempettMnet()
     {
         return new MySqlDem();
     }
 }

我们写好另外一个表的接口和方法后,直接在工厂接口里加入我们新表的接口,这样我们在调用的时候直接去写就OK了。不用再去添加更多的工厂。我们一步步的通过抽象去整个提炼,用细节去实践,再根据我们的需求去调用,

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值