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#生成条形码操作知识汇总附源码下载

    基于C#生成条形码操作知识汇总 什么是条形码? 条形码(英文:Barcode)是用一组粗细不同、间距不同且被平行分成若干个基本单元的直线条及空白,按一定的编码规则,代表不同的字符信息,并经过光电扫描或照相机扫描得到的一种自动识别技术。 C# 中生成条形码的方式 在C#中,可以通过使用各种第三方库和自定义代码的方式来生成条形码。其中主要的几种库包括: ZXin…

    C# 2023年5月31日
    00
  • jsonp格式前端发送和后台接受写法的代码详解

    下面是关于“jsonp格式前端发送和后台接受写法的代码详解”的完整攻略,包含两个示例。 1. JSONP简介 JSONP(JSON with Padding)是一种跨域数据交互的技术。它允许在不同域之间进行数据交互,而不会受到同源策略的限制。JSONP的原理是利用标签的跨域特性,通过在URL中添加一个回调函数名,让服务器返回一个JavaScript函数调用,…

    C# 2023年5月15日
    00
  • 如何通过C#/VB.NET代码将PowerPoint转换为HTML

    利用PowerPoint可以很方便的呈现多媒体信息,且信息形式多媒体化,表现力强。但难免在某些情况下我们会需要将PowerPoint转换为HTML格式。因为HTML文档能独立于各种操作系统平台(如Unix,Windows等)。并且它可以加入图片、声音、动画、影视等内容,还能从一个文件跳转到另一个文件,与世界各地主机的文件连接。通过HTML可以表现出丰富多彩的…

    C# 2023年5月8日
    00
  • C#语法之泛型的多种应用

    C#语法之泛型的多种应用 简介 C#中泛型是一种强类型约束,可以用于定义类、接口、方法等,泛型在.NET框架的类型安全性方面扮演着重要的角色。泛型的定义方式为在类型或方法定义时用尖括号包含泛型参数。例如: // 定义泛型类 class ExampleClass<T> { private T exampleField; public Example…

    C# 2023年5月15日
    00
  • 详解C#获取特定进程CPU和内存使用率

    详解C#获取特定进程CPU和内存使用率 想要获取特定进程的CPU和内存使用率,我们可以使用C#语言结合System.Diagnostics命名空间提供的相关API来实现。 步骤一:获取特定进程 首先我们需要获取我们想要获取的那个进程的实例,可以采用以下方法: Process process = Process.GetProcessesByName(&quot…

    C# 2023年6月7日
    00
  • C# ODP.NET 调用Oracle函数返回值时报错的一个解决方案

    下面是详细讲解“C#ODP.NET调用Oracle函数返回值时报错的一个解决方案”的完整攻略。 问题描述 在使用C#的ODP.NET连接Oracle数据库时,调用Oracle函数返回值时,往往会出现“Oracle.DataAccess.Client.OracleException: ORA-06502: PL/SQL: 数组或者记录数据类型必须具体化来解决这…

    C# 2023年5月15日
    00
  • C#浮点数的表示和基本运算

    C#浮点数是计算机中用于存储非整数数字的数据类型。浮点数的表示与整数不同,因为它需要存储两个部分的信息:一个是数值本身,另一个是小数点的位置。在C#中,浮点数有两种类型:float和double。float占用4个字节,double占用8个字节。 浮点数的表示 在C#中,浮点数的表示采用IEEE 754标准。该标准将浮点数表示为一个符号(正/负)、一个尾数(…

    C# 2023年6月7日
    00
  • C#使用oledb操作excel文件的方法

    C#使用OleDb操作Excel文件的方法,具体过程如下: 1. 引入命名空间 使用 OleDb 操作 Excel 前需要引入 System.Data.OleDb 命名空间。可以通过以下语句在文件头部引入命名空间: using System.Data.OleDb; 2. 连接Excel文件 使用 OleDb 操作 Excel 需要连接到 Excel 文件。连…

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