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# for循环的经典案例集锦

    下面我将为您详细讲解如何实现C#循环的经典案例集锦,包括两个示例。 一、使用for循环实现累加求和 首先,我们来看一个使用for循环实现累加求和的例子。比如需要计算1到100之间的整数之和,实现代码如下: int sum = 0; for(int i=1; i<=100; i++) { sum += i; } Console.WriteLine(&qu…

    C# 2023年5月15日
    00
  • Python实现Event回调机制的方法

    下面是Python实现Event回调机制的方法的详细攻略。 一、什么是Event回调机制 Event回调机制是一种常用的编程模型,它将程序本身与用户的操作分离开来。通过事件触发机制,程序能够根据用户的操作来执行相应操作。比如,我们可以通过Event回调机制在GUI应用程序中实现对鼠标点击、键盘输入等事件的捕捉和响应。 二、Python实现Event回调机制的…

    C# 2023年6月7日
    00
  • Mysql动态更新数据库脚本的示例讲解

    下面为您详细讲解“Mysql动态更新数据库脚本的示例讲解”。 1. 什么是动态更新数据库脚本? 动态更新数据库脚本是指根据实际需求的变化,随时修改已经存在的数据库脚本。这种方式比直接在数据库中手动添加表格和字段要灵活方便得多。 2. Mysql动态更新数据库脚本的实现方法 MySQL的动态更新数据库脚本主要是使用ALTER后续跟着的语句操作。比如: ALTE…

    C# 2023年6月1日
    00
  • Javascript 使用ajax与C#获取文件大小实例详解

    下面我将详细讲解 “Javascript使用ajax与C#获取文件大小实例详解” 的完整攻略。 什么是Ajax? Ajax(Asynchronous JavaScript And XML),指异步的JavaScript和XML。可以在不重新加载整个网页的情况下与服务器交换数据并更新部分网页内容。 通过Ajax获取文件大小的步骤 创建XMLHttpReques…

    C# 2023年5月15日
    00
  • C#基于COM方式读取Excel表格的方法

    下面是C#基于COM方式读取Excel表格的方法的完整攻略。 一、前置条件准备 在使用C#基于COM方式读取Excel表格之前,需要先安装Microsoft Office软件(建议安装MS Office 2010及以上版本),并且安装后需要以管理员身份运行Excel至少一次,以防Excel第一次运行时的初始化过程出错。 二、在C#中使用Excel COM组件…

    C# 2023年6月8日
    00
  • asp.net 动态输出透明gif图片

    在这里为你详细讲解 “ASP.NET 动态输出透明 GIF 图片” 的完整攻略。 背景 在 Web 开发中,使用透明 GIF 图片是非常常见的。比如在某些情况下,需要为标签、标题等添加特定的背景图片,但是图片较小,在使用 PNG 等格式可能会导致文件过大,使得下载速度极慢。而使用透明 GIF 图片,可以解决这个问题,使得页面加载速度更快。 在 ASP.NET…

    C# 2023年6月7日
    00
  • C#实例代码之抽奖升级版可以经表格数据导入数据库,抽奖设置,补抽

    C#实例代码之抽奖升级版 本文将介绍一个C#实例代码,实现抽奖升级版,包括表格数据导入数据库、抽奖设置和补抽功能。 表格数据导入数据库 在抽奖升级版中,我们需要将抽奖名单导入数据库中,以便更好地管理和查询数据。以下是一个将表格数据导入数据库的示例: using System.Data; using System.Data.SqlClient; using E…

    C# 2023年5月15日
    00
  • C#简单的加密类实例

    C#简单的加密类实例攻略 1. 概述 加密是一种常见的安全机制,常用于保护敏感数据的隐私。C#语言提供了多种加密算法,例如DES、AES、RSA等。本攻略将详细讲解如何创建一个简单的加密类,以及如何使用该类对字符串进行加密和解密操作。 2. 创建加密类 首先,我们需要创建一个加密类来实现加密和解密操作。以下是一个基本的加密类: using System; u…

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