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# File.WriteAllText()方法: 将指定的字符串写入文件,覆盖文件中的所有内容

    File.WriteAllText() 是C#中的一个静态方法,主要作用是向文件写入文本并替换文件内容。它的使用方法如下: File.WriteAllText(string path, string contents); 其中,path参数是要写入的文件路径;contents参数是要写入的文本内容。 下面通过两个例子来详细讲解 File.WriteAllTe…

    C# 2023年4月19日
    00
  • C#面向对象编程中开闭原则的示例详解

    C#面向对象编程中开闭原则的示例详解 什么是开闭原则 开闭原则(Open-Closed Principle)是面向对象编程中的一个重要原则,其定义如下: 软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。 也就是说,在软件设计的过程中,可以通过扩展已有的代码来增加新的功能,而不需要修改原有的代码。 如何实现开闭原则 使用抽象类或接口 使用抽象类或接口可…

    C# 2023年5月31日
    00
  • ASP.NET Core依赖注入系列教程之服务的注册与提供

    ASP.NET Core依赖注入系列教程之服务的注册与提供攻略 在ASP.NET Core应用程序中,依赖注入是一种常用的设计模式,用于管理应用程序中的对象和服务。本攻略将介绍如何在ASP.NET Core应用程序中注册和提供服务。 步骤 以下是注册和提供服务的步骤: 创建服务类。 创建一个服务类,该类将提供应用程序所需的服务。例如: public inte…

    C# 2023年5月17日
    00
  • Linq利用Distinct去除重复项问题(可自己指定)

    Linq利用Distinct去除重复项问题(可自己指定) 在Linq中,我们可以使用Distinct方法来去除重复项。但是默认情况下,Distinct方法只能去除基本数据类型的重复项,在处理对象时会遇到一些问题。下面我们来详细讲解如何使用Linq的Distinct方法去除重复项,同时解决对象去重的问题。 1. 基本类型的Distinct去重 对于基本数据类型…

    C# 2023年6月1日
    00
  • C#中方法的详细介绍

    下面是关于“C#中方法的详细介绍”的完整攻略。 什么是方法 方法是 C# 中一种有名字的代码块,用于执行任务。方法成为代码重用的基本单元,它可以在应用程序中重复使用,其可以被传递参数和返回值。在 C# 中,方法的操作通常是与对象进行交互,也可以不直接操作对象而只执行一些函数式操作。 定义方法 定义方法需要声明其名称、参数、返回类型和方法体中的执行代码。以下是…

    C# 2023年5月31日
    00
  • C#页面之间跳转功能的小结

    我来详细讲解一下C#页面之间跳转功能的小结,包含以下几个部分: 使用Response.Redirect方法跳转 使用Server.Transfer方法跳转 使用JavaScript实现页面跳转 1. 使用Response.Redirect方法跳转 Response.Redirect方法可以在当前页面中完成跳转功能。该方法的原型如下: void Respons…

    C# 2023年6月1日
    00
  • .net项目使用日志框架log4net

    下面我将为您详细讲解“.net项目使用日志框架log4net”的完整攻略。本攻略包括以下几个部分: log4net简介 log4net的配置 log4net的使用 示例1:在控制台中输出日志 示例2:将日志信息写入数据库 1. log4net简介 log4net是一个强大的、灵活的、线程安全的日志框架。它支持多种输出方式,包括控制台、文件、数据库等。log4…

    C# 2023年6月3日
    00
  • C#中事件的动态调用实现方法

    下面就为大家详细讲解C#中事件的动态调用实现方法的完整攻略。 简介 在C#中,事件是非常常用的机制。有时我们需要在运行时动态地添加和移除事件的监听器,这时候动态调用事件就显得非常重要了。本文将详细介绍C#中动态调用事件的实现方法。 使用委托实现动态调用事件 C#中事件使用委托实现,在C#中委托是一种特殊的类型,它被用来封装具有相同参数和返回类型的方法。事件本…

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