65.9K
CodeProject 正在变化。 阅读更多。
Home

工厂方法模式

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.27/5 (37投票s)

2013 年 4 月 3 日

CPOL

4分钟阅读

viewsIcon

168006

downloadIcon

1226

轻松理解工厂方法模式

介绍  

在本文中,我试图解释工厂方法模式的概念以及实现工厂方法模式的方法。

背景 

在学习工厂方法模式之前,我想先简单介绍一下“四人帮”,工厂方法模式就属于他们。

四人帮是谁?

“四人帮”是《设计模式:可复用面向对象软件元素》一书的作者。这本重要的书籍描述了各种开发技术和陷阱,并提供了二十三种面向对象编程设计模式。四位作者是 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides。现在我们继续讨论工厂方法模式。

工厂方法:

定义:“工厂模式用于替换类构造函数,抽象对象生成过程,以便在运行时确定要实例化的对象的类型。”

这是工厂方法模式的正式定义。

依我看,为了更容易理解工厂方法模式,我们可以说它是一个在运行时提供类的对象的方法。现在让我们通过一个非常简单的例子来理解这一点。

假设我们有一个冰淇淋工厂。那么首先想到的场景是它显然是生产冰淇淋的。我们可以将它视为我们工厂方法模式的“工厂”。假设您去商店买巧克力冰淇淋。我们通常怎么做?我们点冰淇淋,对吗?然后店主会给我们想要的冰淇淋。在这里,我们将调用这个工厂,它会给我一个巧克力冰淇淋,就像我们在商店里做的那样。这个方法(工厂)的任务将是满足客户提出的所需需求。所以基本上,工厂方法模式只是一个在运行时满足我们对象创建需求的方法。

现在,让我们看一下工厂方法模式的 UML 类图。

现在我们将学习这些块以及它们实际代表的内容。

  1. 具体创建者 (ConcreteCreator):将创建产品的具体类。它将跟踪它创建了什么产品。
  2. 产品 (Product):这是通过组合可用原材料创建的对象。
  3. 创建者 (Creator):这是创建实际产品的接口。
现在我们将在程序中实现工厂方法模式。

首先我们需要理解我们要在哪里实现这个模式,然后是如何实现。让我们回顾一下在哪里实现这个模式的场景。

假设我们有一个冰淇淋工厂。我们生产两种类别的冰淇淋(巧克力和香草)。我们在市场上的销售情况很好。现在有一天,我们接到一位客户打来的一个有趣的电话,说他儿子想要一些不同的口味。他对这两种口味感到厌倦。同样,我们也收到了更多关于改变我们生产的冰淇淋口味问题的电话。所以我们召开了一个紧急会议,并决定为我们尊贵的客户创造一些特别的东西。在会议中,我们也决定使用我们现有可用的原材料和技术。所以很明显,我们只需要改变一些核心项目,这将为我们带来不同的口味和风味,但所有其他程序都将保持不变。

这里的工厂方法模式的理念是,我们可以重复使用我们现有的可用原材料、技术以及任何我们可以用来创造新产品的物品。

在软件开发中,可用的可用事物是方法、属性等。

所以,让我们开发一个可以处理这些类型需求的软件。这就是为什么我们应该使用工厂
方法模式。

一句话,当需求频繁变化时,我们就能够使用工厂方法模式。下面是上述讨论的一个简单演示。

那么现在让我们来编写代码来处理这个问题。

首先,我们需要一个基类,它将包含制作冰淇淋的基本功能。制作冰淇淋的功能对于不同类型的冰淇淋是相同的,但配料不同。所以,我将把制作冰淇淋的基本功能放在一个接口中,然后我将实现这个功能来制作不同类型的冰淇淋(产品)。让我们看看下面的代码。

interface IIceCream
{
    string Functionality();
}
class ChocolateIceCream : IIceCream
{
    public string Functionality()
    {
        return "Chocolate Ice cream";
    }
}
class VanillaIceCream : IIceCream
{
    public string Functionality()
    {
        return "Vanilla Ice cream";
    }
}
class StrawberryIceCream : IIceCream
{
    public string Functionality()
    {
        return "Strawberry Ice cream";
    }
} 

这里 IIceCream 是基接口,它包含我之前描述的功能方法的定义。其他是产品类,它们通过实现 IIceCream 接口的功能定义来制作各自的冰淇淋(产品)。

这是我们程序的基本结构。现在我们需要实现“工厂方法”,它将在运行时创建我们想要的冰淇淋的实例。所以我们现在创建这个方法。

这就是我将如何做。

static class Factory
{
   /// <summary>
   /// This is the Factory method
   /// </summary>
   public static IIceCream Get(int id)
   {
       switch (id)
       {
           case 0:
                return new ChocolateIceCream();
           case 1:
                return new VanillaIceCream();
           case 2:
                return new StrawberryIceCream();
           default:
                return null;
        }
   }
} 

这里 Get() 是工厂方法,它接收用户输入的 id 作为参数,并创建与 case 语句匹配的那个特定类的实例。客户端负责将 id 传递给此方法。所以,这就是我们一直谈论的方法。这是工厂方法模式的主要实现。

我们现在只需要一个客户端来调用这个方法。这是完成程序的客户端代码。

/// <summary>
/// This is the Client
/// </summary>
static void Main()
{
   for (int i = 0; i <= 3; i++)
   {
       var type = Factory.Get(i);
       if (type != null)
       {
           Console.WriteLine("This is Product : " + type.Functionality());
       }
   }
} 

摘要

工厂方法就像常规方法一样,但当我们谈论模式时,它只是在运行时返回一个类的实例。
© . All rights reserved.