引言
我们在日常的开发中,有可能会触发一种极端的情况,我们甲方是那种大客户,我们之前用的是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了。不用再去添加更多的工厂。我们一步步的通过抽象去整个提炼,用细节去实践,再根据我们的需求去调用,