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

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

1. 简介

  • 动机
    • 在软件系统中,经常面临“某个对象”的创建工作;由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口
    • “封装机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖对象的对象”不随着需求变化而变化
  • 意图
    • 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。

2. 示例

2.1. 武器工厂例子

2.1.1. 简单工厂

一个需要通过工厂创建对象的需求,所以不需要抽象,那么武器工厂就是具体实现类通过传参不同,制造不同的武器,返回类型为基类武器,实际对象为继承该基类的对象。

2.1.2. 工厂方法

时间定位在冷兵器的年代,武器种类的需求开始出现,单个工厂的方式出现问题:

  • 代码逻辑复杂: 一个工厂负责所有产品生产
  • 难以维护: 每当新增一个产品都需要修改这个工厂,这时不能保证原有业务不受影响

这时引入了工厂方法模式,可以解决这些问题。

示例:

开始生产的是匕首、太刀,后来需求变化需要宝剑的生产,而且预计后面还会生产其他的武器。

  1. 工厂方法类有且只有一个生产的产品线(方法),比如定义为:武器工厂来生产武器;
  2. 具体的工厂类继承工厂接口,比如:匕首工厂继承武器工厂接口
  3. 实际产品为:匕首(继承自武器
  4. 设计带来的适应性
    • 开始工厂生产的是匕首、太刀,后来因为要适配新武器方便添加的需求,简单工厂模式升级为工厂方法模式
    • 当新种类的武器(宝剑)需要生产,只需要增加宝剑工厂来满足需求,这个工厂可以生产宝剑,宝剑继承基类武器

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. ISqlHelper sqlHelper = fac.CreateSqlHelper();
  13. sqlHelper.Execute();
  14. Console.ReadKey();
  15. }
  16. }
  17. #region 定义接口
  18. //约定工厂能创建那个类型产品 武器工厂
  19. public interface IFactory
  20. {
  21. ISqlHelper CreateSqlHelper();
  22. }
  23. //约定工厂产品的特点 武器
  24. public interface ISqlHelper
  25. {
  26. int Execute();
  27. object ExecuteScale();
  28. }
  29. #endregion
  30. #region 具体实现
  31. //工厂方法的具体实现 太刀工厂
  32. public class MSSQLFactory : IFactory
  33. {
  34. public ISqlHelper CreateSqlHelper()
  35. {
  36. return new MSSQLSqlHelper();
  37. }
  38. }
  39. //工厂方法的具体实现2 匕首工厂
  40. public class MySQLFactory : IFactory
  41. {
  42. public ISqlHelper CreateSqlHelper()
  43. {
  44. return new MySQLSqlHelper();
  45. }
  46. }
  47. //产品的具体实现 匕首
  48. public class MySQLSqlHelper : ISqlHelper
  49. {
  50. public int Execute()
  51. {
  52. Console.WriteLine("MySQLExecute");
  53. return 1;
  54. }
  55. public object ExecuteScale()
  56. {
  57. Console.WriteLine("MySQLExecuteScale");
  58. return new object();
  59. }
  60. }
  61. //产品的具体实现2 太刀
  62. public class MSSQLSqlHelper : ISqlHelper
  63. {
  64. public int Execute()
  65. {
  66. Console.WriteLine("MSSQLExecute");
  67. return 1;
  68. }
  69. public object ExecuteScale()
  70. {
  71. Console.WriteLine("MSSQLExecuteScale");
  72. return new object();
  73. }
  74. }
  75. #endregion
  76. }

参考资料:
https://www.cnblogs.com/sanjun/p/9972386.html

原文链接:http://www.cnblogs.com/BigBrotherStone/p/factory-method.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号