工厂方法模式
轻松理解工厂方法模式
介绍
在本文中,我试图解释工厂方法模式的概念以及实现工厂方法模式的方法。背景
在学习工厂方法模式之前,我想先简单介绍一下“四人帮”,工厂方法模式就属于他们。四人帮是谁?
“四人帮”是《设计模式:可复用面向对象软件元素》一书的作者。这本重要的书籍描述了各种开发技术和陷阱,并提供了二十三种面向对象编程设计模式。四位作者是 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides。现在我们继续讨论工厂方法模式。工厂方法:
定义:“工厂模式用于替换类构造函数,抽象对象生成过程,以便在运行时确定要实例化的对象的类型。”这是工厂方法模式的正式定义。
依我看,为了更容易理解工厂方法模式,我们可以说它是一个在运行时提供类的对象的方法。现在让我们通过一个非常简单的例子来理解这一点。假设我们有一个冰淇淋工厂。那么首先想到的场景是它显然是生产冰淇淋的。我们可以将它视为我们工厂方法模式的“工厂”。假设您去商店买巧克力冰淇淋。我们通常怎么做?我们点冰淇淋,对吗?然后店主会给我们想要的冰淇淋。在这里,我们将调用这个工厂,它会给我一个巧克力冰淇淋,就像我们在商店里做的那样。这个方法(工厂)的任务将是满足客户提出的所需需求。所以基本上,工厂方法模式只是一个在运行时满足我们对象创建需求的方法。
现在,让我们看一下工厂方法模式的 UML 类图。
现在我们将学习这些块以及它们实际代表的内容。
- 具体创建者 (ConcreteCreator):将创建产品的具体类。它将跟踪它创建了什么产品。
- 产品 (Product):这是通过组合可用原材料创建的对象。
- 创建者 (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());
}
}
}