C#设计模式之工厂模式

C#设计模式之工厂模式

什么是工厂模式?

工厂模式是指为创建对象定义一个接口,让子类决定实例化哪一个类。工厂模式让一个类的实例化延迟到其子类。使用工厂模式我们可以让对象的创建和实现分离,当我们需要增加一种新的对象时,我们只需要添加一个新的具体的类和它相应的工厂类就可以了,不会对原来的代码产生太多的影响。

工厂模式的三种形式

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

简单工厂模式

简单工厂模式又叫静态工厂方法模式,在这种模式下,工厂类提供一个静态的工厂方法,用于创建所有的产品对象。这种模式优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

以下是一个简单工厂模式的示例:

public interface IPrinter
{
    void Print(string text);
}

public class A4Printer : IPrinter
{
    public void Print(string text)
    {
        Console.WriteLine($"Printing on A4... {text}");
    }
}

public class A3Printer : IPrinter
{
    public void Print(string text)
    {
        Console.WriteLine($"Printing on A3... {text}");
    }
}

public class PrinterFactory
{
    public enum PrinterType
    {
        A3,
        A4
    }

    public static IPrinter CreatePrinter(PrinterType type)
    {
        switch (type)
        {
            case PrinterType.A3:
                return new A3Printer();
            case PrinterType.A4:
                return new A4Printer();
            default:
                throw new ArgumentException("Invalid printer type", nameof(type));
        }
    }
}

在这个示例中,我们定义了一个IPrinter接口,和两个具体实现A3PrinterA4Printer。我们又定义了一个PrinterFactory,并在其中实现了一个静态方法CreatePrinter,用来创建IPrinter实例。客户端代码只需要通过调用CreatePrinter方法,传递相应的参数,而不用去关心如何创建IPrinter对象。

var printer = PrinterFactory.CreatePrinter(PrinterFactory.PrinterType.A4);
printer.Print("Hello, world!");

工厂方法模式

工厂方法模式又称为工厂模式,它把简单工厂模式中的具体工厂类变成了抽象工厂类和具体工厂子类,降低了工厂类的复杂度,同时,工厂方法模式也提供了扩展的可能。在工厂方法模式中,创建对象的是具体的工厂子类,如有新的对象增加,只需要增加一个具体的类和其对应的工厂子类即可。

以下是一个工厂方法模式的示例:

public interface IAnimal
{
    void Speak();
}

public class Cat : IAnimal
{
    public void Speak()
    {
        Console.WriteLine("Meow~");
    }
}

public class Dog : IAnimal
{
    public void Speak()
    {
        Console.WriteLine("Woof!");
    }
}

public abstract class AnimalFactory
{
    public abstract IAnimal Create();
}

public class CatFactory : AnimalFactory
{
    public override IAnimal Create()
    {
        return new Cat();
    }
}

public class DogFactory : AnimalFactory
{
    public override IAnimal Create()
    {
        return new Dog();
    }
}

在这个示例中,我们定义了IAnimal接口和两个具体实现:CatDog。与简单工厂的区别在于,我们在AnimalFactory中只定义了一个抽象工厂方法Create(),这个方法由具体工厂子类实现。客户端代码只需要通过调用具体的工厂子类的Create()方法就可以创建相应的对象了。

var catFactory = new CatFactory();
var cat = catFactory.Create();
cat.Speak();

var dogFactory = new DogFactory();
var dog = dogFactory.Create();
dog.Speak();

抽象工厂模式

抽象工厂模式是指提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式可以提供一个产品类的库,让工厂子类负责选择并生成一组合适的产品。这样一来,客户端就可以从具体的产品实现中解耦。

以下是一个抽象工厂模式的示例:

public interface IUIFactory
{
    IButton CreateButton();
    ITextBox CreateTextBox();
}

public interface IButton
{
    void Click();
}

public interface ITextBox
{
    void Input(string text);
}

public class WinUIFactory : IUIFactory
{
    public IButton CreateButton()
    {
        return new WinButton();
    }

    public ITextBox CreateTextBox()
    {
        return new WinTextBox();
    }
}

public class MacUIFactory : IUIFactory
{
    public IButton CreateButton()
    {
        return new MacButton();
    }

    public ITextBox CreateTextBox()
    {
        return new MacTextBox();
    }
}

public class WinButton : IButton
{
    public void Click()
    {
        Console.WriteLine("Win Button Clicked");
    }
}

public class MacButton : IButton
{
    public void Click()
    {
        Console.WriteLine("Mac Button Clicked");
    }
}

public class WinTextBox : ITextBox
{
    public void Input(string text)
    {
        Console.WriteLine($"Win Textbox Input: {text}");
    }
}

public class MacTextBox : ITextBox
{
    public void Input(string text)
    {
        Console.WriteLine($"Mac Textbox Input: {text}");
    }
}

在这个示例中,我们定义了抽象工厂IUIFactory,以及两个具体实现WinUIFactoryMacUIFactory,每个工厂都实现了两个方法CreateButton()CreateTextBox()。客户端代码只需要通过具体的工厂实例调用CreateButton()CreateTextBox()方法,就可以得到相应的对象,而不用关心具体是哪一个实现类。

var uiFactory = new MacUIFactory();
var button = uiFactory.CreateButton();
var textBox = uiFactory.CreateTextBox();
button.Click();
textBox.Input("Hello, World!");

总结

通过这篇文章,我们了解了工厂模式的三种形式和实现方式,并通过不同的示例来说明了各自的应用场景和使用方法。工厂模式具有代码扩展性和简化客户端代码的优点,能够更好地支持开闭原则,为软件设计和开发提供了更多的灵活性。

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

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

相关文章

  • C#实现利用Windows API读写INI文件的方法

    下面是“C#实现利用Windows API读写INI文件的方法”的完整攻略: 1. INI文件是什么? INI文件,全称为Initialization File,即初始化文件。是一种常用的配置文件,常被用于存储程序的配置信息和相关参数。INI文件通常包含了多个节(section),每个节又包含多个键值对(key-value pairs),节和键值对之间使用大…

    C# 2023年6月1日
    00
  • C#中Dictionary类使用实例

    下面是“C#中Dictionary类使用实例”的完整攻略,包含以下几个方面的内容: 什么是Dictionary类 如何创建一个Dictionary对象 如何添加和访问字典中的元素 如何遍历字典 示例说明 1. 什么是Dictionary类 Dictionary类是C#中用于表示键值对的泛型集合类。每个键都与一个值相关联,因此可以通过键访问值。 2. 如何创建…

    C# 2023年5月31日
    00
  • C#异步编程几点需要注意的地方

    以下是关于C#异步编程需要注意的几点攻略: 1. 使用async和await关键字 什么是异步编程 异步编程是指可以在主线程任务执行的同时,异步执行另一个线程任务。 C#异步编程的实现方式 在C#中,异步编程可以使用async和await关键字实现。其中,async关键字表示异步方法,而await关键字表示等待异步方法执行完毕。 下面是一个简单示例: pub…

    C# 2023年5月15日
    00
  • 使用.NET升级助手将.NET Framework项目升级为.NET 6

    下面是使用.NET升级助手将.NET Framework项目升级为.NET 6的完整攻略: 一、准备工作 在进行.NET Framework项目升级时, 应该先行备份项目源代码和相关配置文件,以便在升级过程中出现问题时进行恢复。此外,还需要先行安装.NET 6 SDK和Visual Studio 2019或更高版本。 二、升级.NET Framework项目…

    C# 2023年6月3日
    00
  • c#中object、var和dynamic的区别小结

    针对这个问题,我整理了一份详细讲解“C#中Object、var和dynamic的区别”的攻略,下面是详细讲解: Object、var和dynamic的区别小结 在C#编程中,object、var和dynamic是三个常用的类型。虽然它们都可以存储任意类型的数据,但它们的行为却截然不同。 1. Object Object是C#中所有类型的基类,也是一个基本的数…

    C# 2023年5月15日
    00
  • 浅谈ASP.NETCore统一处理404错误都有哪些方式

    ASP.NET Core统一处理404错误的方式有多种,本文将详细讲解这些方式,包括实现过程、示例说明等。 方式一:使用中间件处理404错误 ASP.NET Core提供了中间件来处理404错误。我们可以在Startup.cs文件中添加以下代码: public void Configure(IApplicationBuilder app, IWebHostE…

    C# 2023年5月16日
    00
  • java中的JSONP使用实例详解

    Java中的JSONP使用实例详解 JSONP(JSON with Padding)是一种跨域数据交互的技术,它允许在不同域之间进行数据交互。在Java中,可以使用JSONP来实现跨域数据交互。以下是JSONP的使用实例详解: 1. JSONP的基本原理 JSONP的基本原理是利用标签的跨域特性,将JSON数据作为参数传递给一个回调函数,然后在客户端中调用该…

    C# 2023年5月15日
    00
  • C#实现Stripe支付的方法实践

    C#实现Stripe支付的方法实践 本篇攻略将介绍如何使用C#实现Stripe支付。首先需要注册并获得Stripe API的key,接着进行以下几个步骤: 步骤一:添加Stripe API及其他依赖关系的NuGet软件包 打开Visual Studio,创建一个新项目。在项目中添加Stripe API及其他依赖关系的NuGet软件包,可通过NuGet管理器进…

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