再有人问你抽象工厂设计模式,把这篇文章丢给他
概述
抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一组产品。抽象工厂模式定义如下:
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。
描述需求
分别往SQLserver、mysql、sqliter数据库中添加用户和部门数据。
抽象工厂实现代码
/// <summary> /// 顶层抽象工厂 /// </summary> public interface IFacatory { IDatabaseUser GetDatabaseUser(); IDatabaseDepartment GetDatabaseDepartment(); } /// <summary> /// 具体工厂 /// </summary> public class SqlliteFacatory : IFacatory { public IDatabaseDepartment GetDatabaseDepartment() { return new SqlliteDepartment(); } public IDatabaseUser GetDatabaseUser() { return new SqliteUser(); } } /// <summary> /// 具体工厂 /// </summary> public class MysqlFacatory : IFacatory { public IDatabaseDepartment GetDatabaseDepartment() { return new MysqlDepartment(); } public IDatabaseUser GetDatabaseUser() { return new MysqlUser(); } } /// <summary> /// 具体工厂 /// </summary> public class SqlserverFacatory : IFacatory { public IDatabaseDepartment GetDatabaseDepartment() { return new SqlServerDepartment(); } public IDatabaseUser GetDatabaseUser() { return new SqlServerUser(); } }
/// <summary> /// 用户类 /// </summary> public class User { public string Name { get; set; } public int Id { get; set; } } /// <summary> /// 抽象的产品 /// </summary> public interface IDatabaseUser { void InsertUser(User user); User GetUser(int id); } /// <summary> /// 具体的产品 /// </summary> public class SqlServerUser: IDatabaseUser { public void InsertUser(User user) { Console.WriteLine($"插入了SqlServerUser:{user.Name}"); } public User GetUser(int id) { Console.WriteLine($"获取了Id:{id}的用户"); return null; } } /// <summary> /// 具体的产品 /// </summary> public class MysqlUser : IDatabaseUser { public void InsertUser(User user) { Console.WriteLine($"插入了MysqlUser:{user.Name}"); } public User GetUser(int id) { Console.WriteLine($"获取了Id:{id}的用户"); return null; } } /// <summary> /// 具体的产品 /// </summary> public class SqliteUser : IDatabaseUser { public void InsertUser(User user) { Console.WriteLine($"插入了SqliteUser:{user.Name}"); } public User GetUser(int id) { Console.WriteLine($"获取了Id:{id}的用户"); return null; } }
/// <summary> /// 部门类 /// </summary> public class Department { public string Name { get; set; } public int Id { get; set; } } /// <summary> /// 抽象的产品 /// </summary> public interface IDatabaseDepartment { void InsertDepartment(Department department); Department GetDepartment(int id); } /// <summary> /// 具体的产品 /// </summary> public class SqlServerDepartment : IDatabaseDepartment { public void InsertDepartment(Department department) { Console.WriteLine($"插入了SqlServerDepartment部门:{department.Name}"); } public Department GetDepartment(int id) { Console.WriteLine($"获取了Id:{id}的部门"); return null; } } /// <summary> /// 具体的产品 /// </summary> public class MysqlDepartment : IDatabaseDepartment { public void InsertDepartment(Department department) { Console.WriteLine($"插入了MysqlDepartment部门:{department.Name}"); } public Department GetDepartment(int id) { Console.WriteLine($"获取了Id:{id}的部门"); return null; } } /// <summary> /// 具体的产品 /// </summary> public class SqlliteDepartment : IDatabaseDepartment { public void InsertDepartment(Department department) { Console.WriteLine($"插入了SqlliteDepartment部门:{department.Name}"); } public Department GetDepartment(int id) { Console.WriteLine($"获取了Id:{id}的部门"); return null; } }
//C#控制台调用 Console.WriteLine("抽象工厂"); User user = new(); user.Name = "mhg"; user.Id = 1; //变化点 IFacatory facatory=new SqlserverFacatory(); //MysqlFacatory //SqlliteFacatory IDatabaseUser databaseUser = facatory.GetDatabaseUser(); databaseUser.InsertUser(user); databaseUser?.GetUser(user.Id); Department department = new Department(); department.Name = "研发部"; department.Id = 2; IDatabaseDepartment databaseDepartment= facatory.GetDatabaseDepartment(); databaseDepartment.InsertDepartment(department); databaseDepartment?.GetDepartment(department.Id);
以上就用抽象工厂实现的全部代码,该代码中IFacatory做为抽象工厂,SqlserverFacatory、MysqlFacatory、SqliteFacatory作为具体的产品工厂来生产产品;IDatabaseUser和IDatabaseDepartment为抽象的产品分别生产具体的产品SqlServerUser、MysqlUser、SqliteUser和SqlServerDepartment、MysqlDepartment、SqlliteDepartment。
总结
这个需求也可以用工厂模式实现,但每增加一个产品,就必须增加一个工厂类,而用抽象工厂可以缩减创建子类工厂的数量,不必给每一个产品增加工厂类,可以对产品进行分组,每组中的不同产品由同一个工厂类的不同方法来创建。
作者:realyrare
出处:https://www.cnblogs.com/mhg215/
声援博主:如果您觉得文章对您有帮助,请点击文章末尾的【关注我】吧!
别忘记点击文章右下角的【推荐】支持一波。~~~///(^v^)\\\~~~ .
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果您有其他问题,也欢迎关注我下方的公众号,可以联系我一起交流切磋!
![](https://files-cdn.cnblogs.com/files/mhg215/1.bmp)