C#实现简单工厂模式

yizhihongxing

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# 面向对象之类与对象

    浅谈C#面向对象之类与对象 在 C# 中,类与对象是面向对象程序设计 (OOP) 的核心概念。类是一个模板或者蓝图,用来描述某个对象的属性和方法。对象是类的一个实例,是具有一组属性和方法的实体。 定义类 C# 中定义类使用 class 关键字。类由类名、数据成员和成员函数组成。 例如: public class Person { // 数据成员 privat…

    C# 2023年6月1日
    00
  • c#中如何去除字符串左边的0

    要去除C#中字符串左侧的0,我们可以使用TrimStart()方法。下面是详细的步骤: 步骤1:使用字符串.TrimStart(char[])方法去掉左侧的“0” 使用字符串的TrimStart(char[])方法,可以去掉字符串左侧指定字符集合中的所有字符。由于我们只需要去掉左侧的0,因此我们只需要将0加入到字符集合中即可。下面是一个简单的示例代码: st…

    C# 2023年6月6日
    00
  • 基于C#实现网页爬虫

    基于C#实现网页爬虫完整攻略 网页爬虫是指按照一定的规则,自动抓取互联网上的信息,进行处理、分析和保存的程序。本文将介绍如何使用C#编程语言和相关工具,实现网页爬虫的开发过程。 步骤一:确定目标网站和数据 在开发网页爬虫之前,需要确定爬取哪个网站的数据,以及需要爬取哪些类型的数据,例如新闻、图片、视频等。在确定目标网站和数据后,需要实现以下几个步骤: 分析目…

    C# 2023年6月7日
    00
  • C#数值转换-隐式数值转换表参考

    C# 数值转换 – 隐式数值转换表参考 简介 在C#中,数值类型之间可以相互转换。这种转换可以是隐式的或显式的。如果转换是隐式的,编译器会自动完成转换的过程,而不需要我们显式地指定转换的方式。本文将详细讲解隐式数值转换所遵循的规则以及转换表的内容。 隐式数值转换规则 在C#中,隐式数值转换时要遵循以下规则: 如果两个数值类型的存储大小相同(如int和uint…

    C# 2023年6月7日
    00
  • C#中使用Microsoft Unity记录日志

    当我们的应用程序遇到错误时,我们需要及时捕获和记录错误信息以便于后期排查。在C#中使用Unity框架可以方便地实现日志记录,本文将详细讲解如何使用Unity框架记录日志。 1. 引入Unity框架 要使用Unity框架来记录日志,我们需要将Unity框架引入我们的项目中。我们可以通过NuGet程序包管理器来引入Unity框架。 Install-Package…

    C# 2023年5月15日
    00
  • 浅谈C#数组(一)

    来分享一下“浅谈C#数组(一)”的完整攻略。 简介 C#中的数组是一组具有相同数据类型的元素的集合。在C#中声明数组时需要指定数据类型、数组名称和数组元素数量。 声明和初始化数组 在C#中声明数组的语法如下: <数据类型>[] <数组名称> = new <数据类型>[<元素数量>]; 例如: int[] num…

    C# 2023年5月15日
    00
  • C#中遍历各类数据集合的方法总结

    C#中遍历各类数据集合的方法总结 在C#中,有很多种不同的数据集合类型,包括列表(List)、数组(Array)、队列(Queue)、堆栈(Stack)、哈希表(Hashtable)、字典(Dictionary)等等。在实际编程过程中,我们需要遍历这些数据集合来处理数据。 本文将介绍C#中遍历各类数据集合的方法总结。 遍历列表(List) List<s…

    C# 2023年5月31日
    00
  • ASP.NET Core使用JWT认证授权的方法

    当使用ASP.NET Core构建Web应用程序时,使用JWT(JSON Web Token)进行身份验证和授权是一种常见的方法。JWT是一种轻量级的身份验证和授权机制,它使用JSON格式的令牌来传递用户信息和权限。 以下是使用ASP.NET Core进行JWT身份验证和授权的完整攻略: 步骤一:安装必要的NuGet包 在使用JWT进行身份验证和授权之前,需…

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