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日

相关文章

  • Unity中 ShaderGraph 实现超级炫酷的溶解效果入门级教程

    这里是详细讲解“Unity中 ShaderGraph 实现超级炫酷的溶解效果入门级教程”的完整攻略。 介绍 在Unity中,ShaderGraph是一种非常方便和强大的工具,可以帮助开发者制作各种各样的shader。在本教程中,我们将使用ShaderGraph来制作一个超级炫酷的溶解效果。 设置材质 首先,我们需要为我们的模型设置一个材质,然后把这个材质放到…

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

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

    C# 2023年5月15日
    00
  • C# Convert.ToString()方法: 将指定的值转换为字符串

    下面我会详细讲解C#的Convert.ToString()方法的作用与使用方法。 Convert.ToString()方法的作用 Convert.ToString()方法是将数据转换为字符串的常用方法。该方法可以将任意数据类型(如数字、日期、布尔型变量等)转换为字符串类型的值。 Convert.ToString()方法的使用方法 Convert.ToStri…

    C# 2023年4月19日
    00
  • C#使用ADO.Net部件来访问Access数据库的方法

    访问Access数据库是C#开发中常见的一个需求,使用ADO.NET部件可以十分方便地实现这个功能。以下是完整的攻略,包含了从连接Access数据库到对数据库进行增删改查的操作。 连接Access数据库 在C#中连接Access数据库,需要使用OleDbConnection对象。OleDbConnection对象可以通过传入连接字符串来创建,连接字符串中需要…

    C# 2023年6月2日
    00
  • C#实现字体旋转的方法

    下面就是C#实现字体旋转的完整攻略。 1. 绘制文字 首先,我们需要使用C#绘制文字。对于WinForm应用程序,我们可以在Paint事件中创建一个Graphics对象,然后使用DrawString方法绘制文字。例如: private void Form1_Paint(object sender, PaintEventArgs e) { // 创建Graph…

    C# 2023年6月7日
    00
  • c#网站WebConfig中域名引用示例介绍

    下面是“c#网站WebConfig中域名引用示例介绍”的完整攻略: 1. 简介 WebConfig是c#网站的配置文件,c#网站是一种基于.NET框架的网站开发语言。在WebConfig中,我们可以使用域名引用到其他网站或资源。 2. 域名引用的语法 在WebConfig中进行域名引用的语法格式如下: <configuration> <sy…

    C# 2023年5月31日
    00
  • ASP.NET MVC学习笔记

    ASP.NET MVC学习笔记 – 完整攻略 什么是 ASP.NET MVC ASP.NET MVC 是一种基于模型-视图-控制器(Model-View-Controller,MVC)模式的架构,它提供了一种让 Web 应用程序的逻辑和表现分离的方式。ASP.NET MVC 通过区分应用程序的逻辑(控制器)和 UI(视图)来改进应用程序的可测试性和可维护性。…

    C# 2023年5月31日
    00
  • C#调用C++版本dll时的类型转换需要注意的问题小结

    以下是详细的攻略。 标题 “C#调用C++版本dll时的类型转换需要注意的问题小结” 前言 在C#开发中,调用C++版本的dll时,需要进行类型转换。若不注意,可能会出现类型转换错误,导致程序崩溃。因此需要注意一些问题。 正文 问题1:传递指针类型 在C#中无法直接传递C++中的指针类型,需要通过IntPtr类型进行转换。 例如,C++中的函数声明如下: v…

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