C#实现简单工厂模式

C#实现简单工厂模式

简单工厂模式是一种创建模式,它提供了一种创建对象的最佳方式,即抽象工厂角色生成具体的对象。

在实现C#的简单工厂模式时,需要定义一个抽象产品和多个具体产品类,再设计一个工厂类用于创建各个具体产品。

以下是实现C#的简单工厂模式的完整攻略:

第一步:定义抽象产品

抽象产品是被所创建对象所继承的基类或接口。在这里我们定义了一个抽象类 Fruit,用来作为所有水果类的基类:

public abstract class Fruit
{
    public abstract string GetName();
}

第二步:创建具体产品

根据抽象产品的定义,我们实现两个具体的水果类 OrangeBanana

public class Orange : Fruit
{
    public override string GetName()
    {
        return "Orange";
    }
}

public class Banana : Fruit
{
    public override string GetName()
    {
        return "Banana";
    }
}

第三步:创建工厂类

工厂类是用于创建具体产品的类。在这里我们定义了一个简单的工厂类 FruitFactory,用于根据传入的参数创建对应的具体产品:

public static class FruitFactory
{
    public static Fruit CreateFruit(string fruitName)
    {
        switch (fruitName)
        {
            case "orange":
                return new Orange();
            case "banana":
                return new Banana();
            default:
                throw new ArgumentException("Invalid fruit name.");
        }
    }
}

第四步:使用工厂类创建具体产品

现在我们可以使用工厂类 FruitFactory 来创建具体的水果类实例了:

var orange = FruitFactory.CreateFruit("orange");
var banana = FruitFactory.CreateFruit("banana");

Console.WriteLine(orange.GetName()); // 输出:"Orange"
Console.WriteLine(banana.GetName()); // 输出:"Banana"

以上代码中,我们通过传入不同的参数值来创建不同的水果实例,然后调用它们的 GetName() 方法获取水果的名称。

示例一:通过字符串创建具体类实例

假设我们有一个菜单系统,需要根据用户选择的水果名称字符串来创建对应的具体类实例。我们可以使用上述实现创建一个 FruitMenu 类:

public class FruitMenu
{
    private readonly List<Fruit> _fruits;

    public FruitMenu(string[] fruitNames)
    {
        _fruits = new List<Fruit>();
        foreach (var name in fruitNames)
        {
            _fruits.Add(FruitFactory.CreateFruit(name));
        }
    }

    public void PrintMenu()
    {
        Console.WriteLine("Fruit Menu:");
        foreach (var fruit in _fruits)
        {
            Console.WriteLine(fruit.GetName());
        }
    }
}

通过传入一个水果名称字符串数组,FruitMenu 类在构造函数中调用 FruitFactory.CreateFruit() 方法创建各个具体水果实例,并将它们添加到 _fruits 列表中。然后可以通过 PrintMenu() 方法将菜单输出到控制台上。

下面是一个使用 FruitMenu 类的示例:

var fruitMenu = new FruitMenu(new string[] {"orange", "banana", "orange"});
fruitMenu.PrintMenu();

示例二:通过枚举类型创建具体类实例

除了通过字符串类型来创建具体类实例之外,我们还可以使用枚举类型来指定要创建的具体类实例。

假设我们需要实现一个贩卖机系统,用户可以通过按下相应按钮来购买特定的水果。我们可以定义一个 FruitType 枚举类型,并创建一个 VendingMachine 类来实现这个系统:

public enum FruitType
{
    Orange,
    Banana
}

public class VendingMachine
{
    public Fruit Purchase(FruitType fruitType)
    {
        switch (fruitType)
        {
            case FruitType.Orange:
                return FruitFactory.CreateFruit("orange");
            case FruitType.Banana:
                return FruitFactory.CreateFruit("banana");
            default:
                throw new ArgumentException("Invalid fruit type.");
        }
    }
}

Purchase() 方法中,我们可以通过传入 FruitType 枚举类型来获取用户想要购买的具体水果实例。然后通过调用 FruitFactory.CreateFruit() 方法来创建对应的具体类实例。

下面是一个使用 VendingMachine 类的示例:

var vendingMachine = new VendingMachine();
var orange = vendingMachine.Purchase(FruitType.Orange);
var banana = vendingMachine.Purchase(FruitType.Banana);

Console.WriteLine(orange.GetName());
Console.WriteLine(banana.GetName());

总结

上述攻略中,我们通过定义抽象产品、创建具体产品和设计工厂类的方式实现了C#的简单工厂模式,并提供了两个示例说明如何通过字符串和枚举类型来创建具体类实例。通过使用简单工厂模式,我们可以实现对象的更好重用性和可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现简单工厂模式 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • 在C#中如何使用Dapper详解(译)

    以下是关于“在C#中如何使用 Dapper”的详细攻略: 1. 什么是 Dapper? Dapper 是一个简单、轻量级的 .NET ORM 框架,与其他相似的框架相比,它的性能更高、更稳定,支持多种数据库,包括 SQL Server、MySQL、PostgreSQL 等。 2. 如何使用 Dapper? 首先,我们需要安装 Dapper,可以通过 NuGe…

    C# 2023年5月31日
    00
  • C# Console.ReadLine()方法: 从标准输入流读取下一行字符

    Console.ReadLine() 是 C# 中的一个方法,可以从控制台中读取一行字符串,并将其作为结果返回。具体来说,该方法会等待用户在控制台中输入一个字符串,然后将用户输入的字符串作为一个字符串值返回。该方法是 System.Console 的一个成员方法,可用于在控制台中与用户进行交互。 使用方法: string input = Console.Re…

    C# 2023年4月19日
    00
  • C#实现导出List数据到xml文件的方法【附demo源码下载】

    C#实现导出List数据到xml文件的方法 XML是广泛使用的数据格式,对于C#程序员来说,将C#中的List数据导出到XML文件是一个常见需求。本文将详细介绍如何使用C#实现导出List数据到XML文件的方法,并且提供示例代码。 实现步骤 定义List数据 在C#中,我们需要定义一个List对象,以便将数据存储到其中,例如: List<Person&…

    C# 2023年6月7日
    00
  • asp.net 2个日期之间的整月数的算法

    计算两个日期之间的整月数,通常可以使用以下算法: 我们可以将两个日期的年、月、日字段提取出来,分别计算两个日期的年数差值YearDiff和月数差值MonthDiff 如果两个日期在同一个月份内,即MonthDiff为0,那么这两个日期之间的整月数就为0,否则,我们需要进行以下判断: 1)如果第一个日期的天数小于或等于第二个日期的天数,那么这两个日期之间的整月…

    C# 2023年6月1日
    00
  • ASP.NET Core – 缓存之内存缓存(下)

    话接上篇 [ASP.NET Core – 缓存之内存缓存(上)],所以这里的目录从 2.4 开始。 2.4 MemoryCacheEntryOptions MemoryCacheEntryOptions 是内存缓存配置类,可以通过它配置缓存相关的策略。除了上面讲到的过期时间,我们还能够设置下面这些: 设置缓存优先级。 设置在从缓存中逐出条目后调用的 Post…

    C# 2023年4月18日
    00
  • C#三种方法获取文件的Content-Type(MIME Type)

    首先,我们需要理解什么是 Content-Type(MIME Type)。Content-Type(MIME Type) 是 HTTP 协议头中一部分,用于描述资源的类型。常见的 MIME类型包括:text/html、application/json、image/png 等等。 在 C# 中获取文件的 Content-Type(MIME Type) 有三种方…

    C# 2023年5月31日
    00
  • C#使用系统方法发送异步邮件完整实例

    下面是C#使用系统方法发送异步邮件的完整攻略: 1.前置知识 在学习使用C#发送异步邮件之前,你需要掌握如下知识: C#基础知识,包括语法和常见数据类型; SMTP协议知识,包括SMTP服务器地址、端口、用户名和密码等。 2.引入命名空间 首先,我们需要在C#代码中引入命名空间 System.Net.Mail,因为该命名空间包含了SMTP协议的相关类和方法:…

    C# 2023年6月7日
    00
  • C#获取汉字字符串拼音首字母的方法

    C#获取汉字字符串拼音首字母的方法可以通过使用Pinyin库来实现,该库是GitHub上的一个第三方库,它提供了一系列的方法来生成汉字字符串的拼音首字母和完整拼音。 以下是实现步骤: 1.安装Pinyin库 在VS中获取NuGet包,搜索 Pinyin 并下载。 2.添加命名空间 在代码中添加以下命名空间: using System.Text.Regular…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部