• C#设计模式-工厂方法


     工厂方法模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中

    我们把创建的对象称为"产品",把创建产品的对象称为"工厂".

    如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫"简单工厂模式",

    "工厂方法模式"是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则.

    工厂方法模式的主要优点有:

    用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程(对创建过程复杂的对象很有作用);

    在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

    其缺点是:每增加一个产品就要增加一个具体工厂类,这增加了系统的复杂度.

    结构与实现

    工厂方法模式由抽象工厂,具体工厂,抽象产品和具体产品等4个要素构成

    模式的结构

    抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法CreateProduct()来创建产品.

    • 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建
    • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
    • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

    抽象工厂、抽象产品可以是接口,也可以是抽象类。抽象产品的定义方式取决于产品对象的建模事物,抽象工厂的定义方式一般与抽象产品的定义方式保持一致。

    一般情况下,产品对象是对现实世界中的事物进行建模,使用抽象类定义抽象产品更合理。特殊情况下,产品对象对功能组件、功能实现建模或产品对象已有父对象(C#中对象只能有一个父类)时则使用接口定义抽象产品。

    其结构图如图所示(使用抽象类):

     模式的实现:

    1. class Program
    2. {
    3. static void Main(string[] args)
    4. {
    5. //工厂方法
    6. Product product1 = new ConcreteFactory1().CreateProduct();
    7. product1.ShowInfo();
    8. Product product2 = new ConcreteFactory2().CreateProduct();
    9. product2.ShowInfo();
    10. Console.ReadKey();
    11. }
    12. }
    13. ///
    14. /// 抽象产品类
    15. ///
    16. public abstract class Product
    17. {
    18. public abstract void ShowInfo();
    19. }
    20. ///
    21. /// 具体产品类1
    22. ///
    23. public class ConcreteProduct1 : Product
    24. {
    25. public override void ShowInfo()
    26. {
    27. Console.WriteLine("产品类型为Product1");
    28. }
    29. }
    30. ///
    31. /// 具体产品类2
    32. ///
    33. public class ConcreteProduct2 : Product
    34. {
    35. public override void ShowInfo()
    36. {
    37. Console.WriteLine("产品类型为Product2");
    38. }
    39. }
    40. ///
    41. /// 抽象工厂类
    42. ///
    43. public abstract class AbstractFactory
    44. {
    45. public abstract Product CreateProduct();
    46. }
    47. ///
    48. /// 具体工厂类1
    49. ///
    50. public class ConcreteFactory1 : AbstractFactory
    51. {
    52. public override Product CreateProduct()
    53. {
    54. return new ConcreteProduct1();
    55. }
    56. }
    57. ///
    58. /// 具体工厂类2
    59. ///
    60. public class ConcreteFactory2 : AbstractFactory
    61. {
    62. public override Product CreateProduct()
    63. {
    64. return new ConcreteProduct2();
    65. }
    66. }

  • 相关阅读:
    欧洲专线是什么,欧洲专线物流方式有哪些?
    Java多线程/spring boot多线程
    ARM概念
    炼丹系列1: 分层学习率&梯度累积
    Java实现WebSocket客户端和服务端(简单版)
    [免费专栏] Android安全之APK动态方式逆向应用【三种Smali注入方法】
    服务链路追踪 —— SpringCloud Sleuth
    【云原生】设备入云之基于FlexManager的应用开发
    【大模型和智能问答系统】
    网站都变成灰色的了,代码是怎么实现的呢?
  • 原文地址:https://blog.csdn.net/weixin_49758946/article/details/126323091