工厂设计模式是实时应用程序中最常用的设计模式之一。工厂设计模式属于创意设计模式类别。这里主要介绍以下相关内容:
一、什么是工厂设计模式
二、通过示例了解工厂设计模式
三、在 C# 中不使用工厂模式的示例
四、理解不使用工厂设计模式的问题
五、工厂设计模式在C# 中的实现
六、理解工厂设计模式的UML图
七、何时在实时应用中使用工厂设计模式
八、何时不在实时应用程序中使用工厂设计模式
工厂是一个用于创建其他对象的对象。用技术术语来说,我们可以说工厂是一个带有方法的类。该方法将根据接收到的输入参数“创建并返回不同的对象,简单来说,如果我们有一个超类和 n 个子类,并且根据提供的数据,如果我们必须创建并返回其中一个子类的对象,那么我们需要使用 C# 中的工厂设计模式。在工厂设计模式中,我们创建一个对象,而不将对象创建和初始化逻辑暴露给客户端,客户端将使用公共接口引用新创建的对象。工厂设计模式背后的基本原理是,在运行时,我们根据传递的参数获取相似类型的对象。因此,客户端将获取适当的对象并使用该对象,而无需知道该对象是如何创建和初始化的。
现有三种信用卡类别,即MoneyBack, Titanium, and Platinum。这三个类是 CreditCard 超类的子类,或者可以说是超级接口。CreditCard接口具有三个方法,即GetCardType、GetCreditLimit和GetAnnualCharge。MoneyBack、Titanium、Platinum 子类都实现了CreditCard 的上述三个方法。
我们需要要求用户选择信用卡。用户选择信用卡后,我们需要显示有关所选信用卡的所需信息。让我们首先讨论在 C# 中不使用工厂设计模式来实现这一点。然后,我们将讨论这些问题,最后,我们将使用 C# 中的工厂设计模式创建相同的应用程序。
我们需要创建一个接口或一个抽象类来公开信用卡应具有的操作。因此,创建一个名为CreditCard.cs的类文件并复制并粘贴以下代码。正如您所看到的,我们根据我们的要求使用三种方法创建了 CreditCard 接口。
namespace FactoryDesignPattern
{
public interface CreditCard
{
string GetCardType();
int GetCreditLimit();
int GetAnnualCharge();
}
}
接下来创建三个Product类来实现上述接口。
示例中,有三张信用卡。因此,需要通过实现 CreditCard 接口并为所有三个 CreditCard 方法提供实现来创建三个类。首先,创建一个名为MoneyBack.cs 的类文件。
namespace FactoryDesignPattern
{
class MoneyBack : CreditCard
{
public string GetCardType()
{
return "MoneyBack";
}
public int GetCreditLimit()
{
return 15000;
}
public int GetAnnualCharge()
{
return 500;
}
}
}
此类实现了 CreditCard 接口并提供了所有三个方法的实现。同样,再对其他两种信用卡类别执行相同的操作。
Titanium.cs:
namespace FactoryDesignPattern
{
public class Titanium : CreditCard
{
public string GetCardType()
{
return "Titanium Edge";
}
public int GetCreditLimit()
{
return 25000;
}
public int GetAnnualCharge()
{
return 1500;
}
}
}
Platinum.cs:
namespace FactoryDesignPattern
{
public class Platinum : CreditCard
{
public string GetCardType()
{
return "Platinum Plus";
}
public int GetCreditLimit()
{
return 35000;
}
public int GetAnnualCharge()
{
return 2000;
}
}
}
客户端代码只不过是需要使用产品类(MoneyBack、Titanium 和 Platinum)的类。在示例中,它将是 Program 类的 Main 方法。我们将要求用户在客户端代码中选择信用卡类型。基于选定的信用卡,创建上述三个产品实现类(MoneyBack、Titanium 和 Platinum)中任意一个的实例,并调用方法来显示信用卡详细信息。因此,修改 Program 类的 Main 方法如下。
using System;
namespace FactoryDesignPattern
{
class Program
{
static void Main(string[] args)
{
string cardType = "MoneyBack";
CreditCard cardDetails = null;
if (cardType == "MoneyBack")
{
cardDetails = new MoneyBack();
}
else if (cardType == "Titanium")
{
cardDetails = new Titanium();
}
else if (cardType == "Platinum")
{
cardDetails = new Platinum();
}
if (cardDetails != null)
{
Console.WriteLine("CardType : " + cardDetails.GetCardType());
Console.WriteLine("CreditLimit : " + cardDetails.GetCreditLimit());
Console.WriteLine("AnnualCharge :" + cardDetails.GetAnnualCharge());
}
else
{
Console.Write("Invalid Card Type");
}
Console.ReadLine();
}
}
}
上面的代码实现非常简单。获得 CardType 值后,使用 IF-ELSE 条件创建适当的信用卡实例。然后调用这三个方法在控制台窗口上显示信用卡信息。因此,运行该应用程序时,获得预期的输出,如下所示。
CardType :MoneyBack
CreditLimit :1500
AnnualCharge :500
上述代码实现引入了以下问题
接下来将实现如何使用 C# 中的工厂设计模式来克服上述问题。
根据工厂设计模式的定义,工厂设计模式创建一个对象,而不将对象创建逻辑暴露给客户端,客户端使用公共接口引用新创建的对象。
如下面的图片所示,工厂类负责创建并返回适当的产品(即 MoneyBack、Titanium 和 Platinum)对象。该类有一个静态方法,即 GetCreditcard,并且该方法采用一个输入参数,并且根据参数值,它将创建信用卡(即 MoneyBack、Platinum 和 Titanium)对象之一,并且将该对象存储在超类(CrditCard)引用变量中,最后将该超类引用变量返回给该方法的调用者,即客户端。
现在,客户端只需要通过CreditCardFactory即可获取该对象。例:
CreditCard cardDetails = CreditCardFactory.GetCreditCard("Platinum");
cardDetails.GetCardType();
cardDetails.GetCreditLimit();
cardDetails.GetAnnualCharge();
创建一个名为CreditCardfactory.cs的类文件,此类包含创建和初始化适当对象并根据某些条件返回该对象的逻辑。该类包含一个静态方法,该静态方法采用一个字符串参数,并根据参数值创建并向客户端返回适当的产品实例(MoneyBack、Titanium 和 Platinum)。
namespace FactoryDesignPattern
{
public class CreditCardFactory
{
public static CreditCard GetCreditCard(string cardType)
{
CreditCard cardDetails = null;
if (cardType == "MoneyBack")
{
cardDetails = new MoneyBack();
}
else if (cardType == "Titanium")
{
cardDetails = new Titanium();
}
else if (cardType == "Platinum")
{
cardDetails = new Platinum();
}
return cardDetails;
}
}
}
using System;
namespace FactoryDesignPattern
{
class Program
{
static void Main(string[] args)
{
CreditCard cardDetails = CreditCardFactory.GetCreditCard("Platinum");
if (cardDetails != null)
{
Console.WriteLine("CardType : " + cardDetails.GetCardType());
Console.WriteLine("CreditLimit : " + cardDetails.GetCreditLimit());
Console.WriteLine("AnnualCharge :" + cardDetails.GetAnnualCharge());
}
else
{
Console.Write("Invalid Card Type");
}
Console.ReadLine();
}
}
}
输出:
CardType :Platinum Plus
CreditLimit : 35000
AnnualCharge :2000
以下是工厂设计模式 UML 图中典型组件的细分:
以下是实时应用程序中的一些场景,您可以考虑在 C# 中使用工厂设计模式: