翼度科技»论坛 编程开发 .net 查看内容

再有人问你抽象工厂设计模式,把这篇文章丢给他

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
概述

抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一组产品。抽象工厂模式定义如下:
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。
描述需求

分别往SQLserver、mysql、sqliter数据库中添加用户和部门数据。
抽象工厂实现代码
  1.    /// <summary>
  2.     /// 顶层抽象工厂
  3.     /// </summary>
  4.     public interface IFacatory
  5.     {
  6.         IDatabaseUser GetDatabaseUser();
  7.         IDatabaseDepartment GetDatabaseDepartment();
  8.     }
  9.     /// <summary>
  10.     /// 具体工厂
  11.     /// </summary>
  12.     public class SqlliteFacatory : IFacatory
  13.     {
  14.         public IDatabaseDepartment GetDatabaseDepartment()
  15.         {
  16.             return  new SqlliteDepartment();
  17.         }
  18.         public IDatabaseUser GetDatabaseUser()
  19.         {
  20.             return new SqliteUser();
  21.         }
  22.     }
  23.     /// <summary>
  24.     /// 具体工厂
  25.     /// </summary>
  26.     public class MysqlFacatory : IFacatory
  27.     {
  28.         public IDatabaseDepartment GetDatabaseDepartment()
  29.         {
  30.             return new MysqlDepartment();
  31.         }
  32.         public IDatabaseUser GetDatabaseUser()
  33.         {
  34.             return new MysqlUser();
  35.         }
  36.     }
  37.     /// <summary>
  38.     /// 具体工厂
  39.     /// </summary>
  40.     public class SqlserverFacatory : IFacatory
  41.     {
  42.         public IDatabaseDepartment GetDatabaseDepartment()
  43.         {
  44.             return new SqlServerDepartment();
  45.         }
  46.         public IDatabaseUser GetDatabaseUser()
  47.         {
  48.             return new SqlServerUser();
  49.         }
  50.     }
复制代码
  1.     /// <summary>
  2.     /// 用户类
  3.     /// </summary>
  4.     public class User
  5.     {
  6.         public string  Name { get; set; }
  7.         public int Id { get; set; }
  8.     }
  9.     /// <summary>
  10.     /// 抽象的产品
  11.     /// </summary>
  12.     public interface IDatabaseUser
  13.     {
  14.         void InsertUser(User user);
  15.         User GetUser(int id);
  16.     }
  17.     /// <summary>
  18.     /// 具体的产品
  19.     /// </summary>
  20.     public class SqlServerUser: IDatabaseUser
  21.     {
  22.         public void InsertUser(User user)
  23.         {
  24.             Console.WriteLine($"插入了SqlServerUser:{user.Name}");
  25.         }
  26.         public User GetUser(int id)
  27.         {
  28.             Console.WriteLine($"获取了Id:{id}的用户");
  29.             return null;
  30.         }
  31.     }
  32.     /// <summary>
  33.     /// 具体的产品
  34.     /// </summary>
  35.     public class MysqlUser : IDatabaseUser
  36.     {
  37.         public void InsertUser(User user)
  38.         {
  39.             Console.WriteLine($"插入了MysqlUser:{user.Name}");
  40.         }
  41.         public User GetUser(int id)
  42.         {
  43.             Console.WriteLine($"获取了Id:{id}的用户");
  44.             return null;
  45.         }
  46.     }
  47.     /// <summary>
  48.     /// 具体的产品
  49.     /// </summary>
  50.     public class SqliteUser : IDatabaseUser
  51.     {
  52.         public void InsertUser(User user)
  53.         {
  54.             Console.WriteLine($"插入了SqliteUser:{user.Name}");
  55.         }
  56.         public User GetUser(int id)
  57.         {
  58.             Console.WriteLine($"获取了Id:{id}的用户");
  59.             return null;
  60.         }
  61.     }
复制代码
  1.    /// <summary>
  2.     /// 部门类
  3.     /// </summary>
  4.     public class Department
  5.     {
  6.         public string Name { get; set; }
  7.         public int Id { get; set; }
  8.     }
  9.     /// <summary>
  10.     /// 抽象的产品
  11.     /// </summary>
  12.     public interface IDatabaseDepartment
  13.     {
  14.         void InsertDepartment(Department department);
  15.         Department GetDepartment(int id);
  16.     }
  17.     /// <summary>
  18.     /// 具体的产品
  19.     /// </summary>
  20.     public class SqlServerDepartment : IDatabaseDepartment
  21.     {
  22.         public void InsertDepartment(Department  department)
  23.         {
  24.             Console.WriteLine($"插入了SqlServerDepartment部门:{department.Name}");
  25.         }
  26.         public Department GetDepartment(int id)
  27.         {
  28.             Console.WriteLine($"获取了Id:{id}的部门");
  29.             return null;
  30.         }
  31.     }
  32.     /// <summary>
  33.     /// 具体的产品
  34.     /// </summary>
  35.     public class MysqlDepartment : IDatabaseDepartment
  36.     {
  37.         public void InsertDepartment(Department department)
  38.         {
  39.             Console.WriteLine($"插入了MysqlDepartment部门:{department.Name}");
  40.         }
  41.         public Department GetDepartment(int id)
  42.         {
  43.             Console.WriteLine($"获取了Id:{id}的部门");
  44.             return null;
  45.         }
  46.     }
  47.     /// <summary>
  48.     /// 具体的产品
  49.     /// </summary>
  50.     public class SqlliteDepartment : IDatabaseDepartment
  51.     {
  52.         public void InsertDepartment(Department department)
  53.         {
  54.             Console.WriteLine($"插入了SqlliteDepartment部门:{department.Name}");
  55.         }
  56.         public Department GetDepartment(int id)
  57.         {
  58.             Console.WriteLine($"获取了Id:{id}的部门");
  59.             return null;
  60.         }
  61.     }
复制代码
  1. //C#控制台调用
  2. Console.WriteLine("抽象工厂");
  3. User user = new();
  4. user.Name = "mhg";
  5. user.Id = 1;
  6. //变化点
  7. IFacatory facatory=new SqlserverFacatory(); //MysqlFacatory //SqlliteFacatory
  8. IDatabaseUser databaseUser = facatory.GetDatabaseUser();
  9. databaseUser.InsertUser(user);
  10. databaseUser?.GetUser(user.Id);
  11. Department department = new Department();
  12. department.Name = "研发部";
  13. department.Id = 2;
  14. IDatabaseDepartment databaseDepartment=  facatory.GetDatabaseDepartment();
  15. databaseDepartment.InsertDepartment(department);   
  16. databaseDepartment?.GetDepartment(department.Id);
复制代码
以上就用抽象工厂实现的全部代码,该代码中IFacatory做为抽象工厂,SqlserverFacatory、MysqlFacatory、SqliteFacatory作为具体的产品工厂来生产产品;IDatabaseUser和IDatabaseDepartment为抽象的产品分别生产具体的产品SqlServerUser、MysqlUser、SqliteUser和SqlServerDepartment、MysqlDepartment、SqlliteDepartment。
总结

这个需求也可以用工厂模式实现,但每增加一个产品,就必须增加一个工厂类,而用抽象工厂可以缩减创建子类工厂的数量,不必给每一个产品增加工厂类,可以对产品进行分组,每组中的不同产品由同一个工厂类的不同方法来创建。

来源:https://www.cnblogs.com/mhg215/archive/2023/02/16/17122301.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具