经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
Abstract-Factory抽象工厂模式
来源:cnblogs  作者:大师兄石头  时间:2021/2/18 15:34:52  对本文有异议

>>返回《C#常用设计模式》

1. 简介

抽象工厂就是将生产实例工厂和生产的产品进行抽象,使得可以在不同的场景更换工厂,生产出具有抽象产品特点的一系列实际产品。

类图:

抽象工厂: AbstractFactory
实际工厂: ConcreteFactory1, ConcreteFactory1
抽象产品: AbstractProductA, AbstractProductB
实际产品: ProductA1, ProductA2

2. 示例

2.1. 武器工厂例子

时间定位在出现了热兵器之后,热兵器的出现,导致武器被细分,需要将之前使用工厂方法的业务复杂化,抽象出了携带方便的武器和威力强的武器,导致工厂方法的设计不能满足我们的需求,这个时候出现了抽象工厂设计模式。

  1. 抽象工厂类定义工厂生产哪些产品,其中生产方法的定义,比如:生产携带方便的武器、生产威力强的武器;
  2. 抽象工厂制造的产品抽象出产品的特点作为产品基类,比如:武器(攻击),武器的派生类携带方便的武器(绑在腿上),其中基类武器,不是必须的;
  3. 具体的实现工厂继承抽象工厂,比如:军刀工厂继承武器工厂;
  4. 实际产品为:携带方便的武器(匕首),威力强的武器(砍刀);
  5. 匕首会实现相应的方法(攻击、绑在腿上);
  6. 设计带来的适应性
    • 开始使用特定的工厂生产匕首、军刀
    • 由于武器的应用场景被细分,武器被分为了多个种类,后来时代进步出现了枪械等武器,激化了矛盾导致设计重构
    • 首先,细分产品抽象: 携带方便的武器和生产威力强的武器
    • 然后,重构工厂抽象,使其支持创建上述两种抽象武器
    • 最后,编写相应的抽象的实现:军刀工厂、枪械工厂、匕首、太刀、手枪、机枪
    • 这样实现了现有需求,而且具备了适应可能出现的武器(比如:激光武器)的适应性

2.2. 数据库访问工厂代码示例

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace Demo
  6. {
  7. class Program
  8. {
  9. static IFactory fac = new MySQLFactory();
  10. static void Main(string[] args)
  11. {
  12. IUserDAL userDAL = fac.CreateUserDAL();
  13. userDAL.AddUser();
  14. Console.ReadKey();
  15. }
  16. }
  17. #region 定义接口
  18. //约定工厂能创建那些类型产品 武器工厂
  19. public interface IFactory
  20. {
  21. IUserDAL CreateUserDAL();
  22. IRoleDAL CreateRoleDAL();
  23. }
  24. //约定工厂产品的特点 携带方便的武器
  25. public interface IUserDAL
  26. {
  27. void AddUser();
  28. }
  29. // 威力强的武器
  30. public interface IRoleDAL
  31. {
  32. void AddRole();
  33. }
  34. #endregion
  35. #region 具体实现
  36. //工厂的具体实现 军刀工厂
  37. public class MySQLFactory : IFactory
  38. {
  39. public IUserDAL CreateUserDAL()
  40. {
  41. return new MySQLUserDAL();
  42. }
  43. public IRoleDAL CreateRoleDAL()
  44. {
  45. return new MySQLRoleDAL();
  46. }
  47. }
  48. //产品的具体实现 匕首
  49. public class MySQLUserDAL : IUserDAL
  50. {
  51. public void AddUser()
  52. {
  53. Console.WriteLine("MySQLAddUser");
  54. }
  55. }
  56. //太刀
  57. public class MySQLRoleDAL : IRoleDAL
  58. {
  59. public void AddRole()
  60. {
  61. Console.WriteLine("MySQLAddRole");
  62. }
  63. }
  64. //工厂的具体实现 枪械工厂
  65. public class MSSQLFactory : IFactory
  66. {
  67. public IUserDAL CreateUserDAL()
  68. {
  69. return new MSSQLUserDAL();
  70. }
  71. public IRoleDAL CreateRoleDAL()
  72. {
  73. return new MSSQLRoleDAL();
  74. }
  75. }
  76. //产品的具体实现 手枪
  77. public class MSSQLUserDAL : IUserDAL
  78. {
  79. public void AddUser()
  80. {
  81. Console.WriteLine("MSSQLAddUser");
  82. }
  83. }
  84. //机枪
  85. public class MSSQLRoleDAL : IRoleDAL
  86. {
  87. public void AddRole()
  88. {
  89. Console.WriteLine("MSSQLAddRole");
  90. }
  91. }
  92. #endregion
  93. }

3. 要点

  1. 预防过度设计,如果没有应对“系列对象构建”的需求变化,则没有必要使用Abstract Factory模式。
    1. “系列对象”指的是这些对象之间有相互依赖、或作用的关系,例如游戏开发场景中的“道路”与“房屋”的依赖,“道路”与“地道”的依赖。
  2. Abstract Factory模式主要在于应对“新系列”的需求变动。其缺点在于难以应对“新对象”的需求变动。
  3. Abstract Factory模式经常和Factory Method模式共同组合应对“对象创建”的需求变化。

原文链接:http://www.cnblogs.com/BigBrotherStone/p/abstract-factory.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号