c#设计模式-创建型模式 之 工厂模式

简介: 工厂模式(Factory Pattern)是一种常用的对象创建型设计模式。该模式的主要思想是提供一个创建对象的接口(也可以是抽象类、静态方法等),将实际创建对象的工作推迟到子类中进行。这样一来,客户端只需关注接口而无须了解具体的类实现,实现了代码的解耦,提高了系统的可维护性和扩展性。工厂模式可以分为简单工厂模式,工厂方法模式和抽象工厂模式。简单工厂模式:又叫静态工厂方法模式,它是由一个工厂对象决定创建出哪一种产品类的实例,但它不属于工厂模式家族,它属于创建型模式,但不属于23种GOF设计模式之一。

 前言:

工厂模式(Factory Pattern)是一种常用的对象创建型设计模式。该模式的主要思想是提供一个创建对象的接口(也可以是抽象类、静态方法等),将实际创建对象的工作推迟到子类中进行。这样一来,客户端只需关注接口而无须了解具体的类实现,实现了代码的解耦,提高了系统的可维护性和扩展性。

工厂模式可以分为简单工厂模式,工厂方法模式和抽象工厂模式。

    • 简单工厂模式:又叫静态工厂方法模式,它是由一个工厂对象决定创建出哪一种产品类的实例,但它不属于工厂模式家族,它属于创建型模式,但不属于23种GOF设计模式之一。
    • 工厂方法模式:提供了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法让类把实例化推迟到子类。
    • 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。

    简单工厂模式

    简单工厂模式主要由三个部分组成:

      1. 工厂角色(Factory):负责实现创建所有实例的内部逻辑
      2. 抽象产品角色(Product Interface):是工厂类所创建所有对象的父类,封装了各种产品对象的公有方法
      3. 具体产品角色(ConcreteProduct):它是抽象产品角色的一个或多个具体角色,完成具体产品的创建

      简单工厂模式适合于产品数量较少且稳定,客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心的情况。如果产品数量较多且经常变动,使用简单工厂可能会导致工厂方法内部过于复杂,不便于管理和维护。

      抽象产品角色

      创建一个动物接口,有一个方法speak

      public interface IAinimal
      {
          void Speak();
      }

      image.gif

      具体产品角色

      创建两个实现了IAnimal接口的类,分别是DogCat

      public class dog : IAinimal
      {
          public void Speak()
          {
              Console.WriteLine("汪汪汪");
          }
      }
      public class cat : IAinimal
      {
          public void Speak()
          {
              Console.WriteLine("喵喵喵");
          }
      }

      image.gif

      工厂角色

      创建一个简单工厂类SimpleAinimalFactory,里面有一个静态方法CreateAinimal,该方法接收一个字符串参数,根据参数创建不同的对象

      public static class SimpleAinimalFactory
      {
          public static IAinimal CreateAinimal(string type)
          {
              if ("cat".Equals(type))
              {
                  return new cat();
              }
              else if ("dog".Equals(type))
              {
                  return new dog();
              }
              else
              {
                  throw new Exception("Invalid animal type");
              }
          }
      }

      image.gif

      使用简单工厂

      public static void Main(string[] args)
          {
              IAinimal dog = SimpleAinimalFactory.CreateAinimal("dog");
              dog.Speak();
              IAinimal cat = SimpleAinimalFactory.CreateAinimal("cat");
              cat.Speak();
          }

      image.gif

      image.gif

      后期如果再加新的动物,我们势必要需求修改SimpleAinimalFactory的代码,违反了开闭原则。

      工厂方法模式

      针对上例中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则。

      工厂方法模式的主要角色:

        1. 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂 方法来创建产品。
        2. 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
        3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
        4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同 具体工厂之间一一对应。

        抽象产品和具体产品同上不变,将工厂角色抽出来,改成抽象工厂+具体工厂

        抽象工厂

        public interface IAinimalFactory
        {
            IAinimal createAinimal();
        }

        image.gif

        具体工厂

        public class CatAinimalFactory : IAinimalFactory
        {
            public IAinimal createAinimal()
            {
                return new cat();
            }
        }
        public class DogAinimalFactory : IAinimalFactory
        {
            public IAinimal createAinimal()
            {
                return new dog();
            }
        }

        image.gif

        使用工厂

        public static void Main(string[] args)
            {
                var catAinimalFactory = new CatAinimalFactory();
                var ainimal = catAinimalFactory.createAinimal();
                ainimal.Speak();
            }

        image.gif

        与简单工厂不同的地方就是这边先获取一个对应的具体工厂,再通过具体工厂拿到具体产品。在使用时,用于只需知道产品对应的具体工厂,关注具体的创建过程,甚至不需要知道具体产品类的类名,当我们选择哪个具体工厂时,就已经决定了实际创建的产品是哪个了。


        目录
        相关文章
        |
        1月前
        |
        设计模式 Java
        【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
        【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
        55 2
        |
        1月前
        |
        设计模式 C#
        C# 一分钟浅谈:工厂模式与抽象工厂模式
        【10月更文挑战第10天】本文介绍了面向对象编程中的两种常见创建型设计模式:工厂模式和抽象工厂模式。工厂模式通过共同接口创建对象,隐藏创建逻辑,提高封装性和扩展性;抽象工厂模式则提供了一系列相关对象的创建接口,适用于多个相关产品族的创建。文章通过C#代码示例详细解释了这两种模式的实现和应用场景,并讨论了它们的优点、缺点及常见问题。
        57 19
        |
        1月前
        |
        设计模式 安全 Java
        C# 一分钟浅谈:设计模式之单例模式
        【10月更文挑战第9天】单例模式是软件开发中最常用的设计模式之一,旨在确保一个类只有一个实例,并提供一个全局访问点。本文介绍了单例模式的基本概念、实现方式(包括饿汉式、懒汉式和使用 `Lazy<T>` 的方法)、常见问题(如多线程和序列化问题)及其解决方案,并通过代码示例详细说明了这些内容。希望本文能帮助你在实际开发中更好地应用单例模式,提高代码质量和可维护性。
        33 1
        |
        2月前
        |
        设计模式
        设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
        这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
        设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
        |
        3月前
        |
        设计模式 存储 负载均衡
        【五】设计模式~~~创建型模式~~~单例模式(Java)
        文章详细介绍了单例模式(Singleton Pattern),这是一种确保一个类只有一个实例,并提供全局访问点的设计模式。文中通过Windows任务管理器的例子阐述了单例模式的动机,解释了如何通过私有构造函数、静态私有成员变量和公有静态方法实现单例模式。接着,通过负载均衡器的案例展示了单例模式的应用,并讨论了单例模式的优点、缺点以及适用场景。最后,文章还探讨了饿汉式和懒汉式单例的实现方式及其比较。
        【五】设计模式~~~创建型模式~~~单例模式(Java)
        |
        2月前
        |
        设计模式 C# 开发者
        C#设计模式入门实战教程
        C#设计模式入门实战教程
        |
        3月前
        |
        设计模式 Java
        Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
        【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
        42 1
        |
        3月前
        |
        设计模式 算法 开发者
        深入理解工厂模式与策略模式:设计模式的灵活应用
        深入理解工厂模式与策略模式:设计模式的灵活应用
        |
        3月前
        |
        设计模式 算法 C#
        C#设计模式之策略模式
        C#设计模式之策略模式
        86 19
        |
        3月前
        |
        设计模式 XML 存储
        【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
        文章详细介绍了抽象工厂模式,这是一种创建型设计模式,用于提供一个接口以创建一系列相关或相互依赖的对象,而不指定它们具体的类。通过代码示例和结构图,文章展示了抽象工厂模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了如何通过配置文件和反射机制实现工厂的动态创建。
        【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)