Tutorialsteacher

关注我们

文章
  • C#
  • C# 面向对象编程
  • ASP.NET Core
  • ASP.NET MVC
  • LINQ
  • 控制反转 (IoC)
  • Web API
  • JavaScript
  • TypeScript
  • jQuery
  • Angular 11
  • Node.js
  • D3.js
  • Sass
  • Python
  • Go lang
  • HTTPS (SSL)
  • 正则表达式
  • SQL
  • SQL Server
  • PostgreSQL
  • MongoDB
  • C# - 入门
  • C# - 版本历史
  • C# - 第一个程序
  • C# - 关键词
  • C# - 类和对象
  • C# - 命名空间
  • C# - 变量
  • C# - 隐式类型变量
  • C# - 数据类型
  • 数字
  • 字符串
  • DateTime
  • 结构体
  • 枚举
  • StringBuilder
  • 匿名类型
  • 动态类型
  • 可空类型
  • C# - 值类型和引用类型
  • C# - 接口
  • C# - 运算符
  • C# - if else 语句
  • C# - 三元运算符 ?
  • C# - Switch 语句
  • C# - For 循环
  • C# - While 循环
  • C# - Do-while 循环
  • C# - 分部类
  • C# - Static 关键字
  • C# - 数组
  • 多维数组
  • 交错数组
  • C# - 索引器
  • C# - 泛型
  • 泛型约束
  • C# - 集合
  • ArrayList
  • List
  • SortedList
  • Dictionary
  • Hashtable
  • Stack
  • Queue
  • C# - 元组
  • C# - ValueTuple
  • C# - 内置异常
  • 异常处理
  • throw 关键字
  • 自定义异常
  • C# - 委托
  • Func 委托
  • Action 委托
  • Predicate 委托
  • 匿名方法
  • C# - 事件
  • C# - 协变
  • C# - 扩展方法
  • C# - 流 I/O
  • C# - File 类
  • C# - FileInfo 类
  • C# - 对象初始化器
  • OOP - 概述
  • 面向对象编程
  • 抽象
  • 封装
  • 关联与组合
  • 继承
  • 多态
  • 方法重写
  • 方法隐藏
  • C# - SOLID 原则
  • 单一职责原则
  • 开闭原则
  • 里氏替换原则
  • 接口隔离原则
  • 依赖倒置原则
  • 设计模式
  • 单例模式
  • 抽象工厂模式
  • 工厂方法模式
Entity Framework Extensions - 提升 EF Core 9
  批量插入
  批量删除
  批量更新
  批量合并

C# 中的工厂方法设计模式

您将学习工厂方法设计模式及其在 C# 中的实现,并通过实际示例了解如何在应用程序中使用此模式。

工厂方法模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪个类。通过使用此模式,您可以将对象创建逻辑封装在子类的独立方法中。这在需要创建的对象类型可能根据特定条件而变化的情况下非常有用。

工厂方法设计模式的结构

工厂方法模式由以下组件组成:

  1. 创建者 (Creator):这是一个抽象类或接口,声明工厂方法。它还提供创建产品的接口。
  2. 具体创建者 (Concrete Creator):这是一个继承创建者并实现工厂方法的类。它决定创建哪个具体类。
  3. 产品 (Product):这是一个抽象类或接口,定义工厂创建的对象的接口。
  4. 具体产品 (Concrete Product):这些是实现产品接口的类。

在 C# 中实现工厂方法设计模式

要在 C# 中实现工厂方法模式,您需要为创建者和产品创建抽象类或接口。然后,您可以创建继承这些抽象类或实现接口的具体类。

在创建者类中,您定义工厂方法,它必须是返回产品实例的抽象方法。创建者的每个子类都可以重写此方法以返回不同的具体产品。

以下示例演示了如何在 C# 中实现工厂方法模式:

示例:工厂方法结构实现
using System;

public class Program
{
	public static void Main()
	{
		Creator creator = new ConcreteCreator1();
		creator.UseProduct();
		Creator creator2 = new ConcreteCreator2();
		creator2.UseProduct();
	}
}

// Product
public interface IProduct
{
	void Execute();
}

// Concrete Product 1
public class ConcreteProduct1 : IProduct
{
	public void Execute()
	{
		Console.WriteLine("Executing ConcreteProduct1");
	}
}

// Concrete Product 2
public class ConcreteProduct2 : IProduct
{
	public void Execute()
	{
		Console.WriteLine("Executing ConcreteProduct2");
	}
}

// Creator
public abstract class Creator
{
	public abstract IProduct FactoryMethod();
	public void UseProduct()
	{
		IProduct product = FactoryMethod();
		product.Execute();
	}
}

// Concrete Creator 1
public class ConcreteCreator1 : Creator
{
	public override IProduct FactoryMethod()
	{
		Console.WriteLine("Creating ConcreteProduct1 object from the subclass ConcreteProduct1");
		return new ConcreteProduct1();
	}
}

// Concrete Creator 2
public class ConcreteCreator2 : Creator
{
	public override IProduct FactoryMethod()
	{
		Console.WriteLine("Creating ConcreteProduct2 object from the subclass ConcreteProduct2");
		return new ConcreteProduct2();
	}
}
尝试一下

在上面的代码中,我们定义了 `IProduct` 接口和两个具体产品类,`ConcreteProduct1` 和 `ConcreteProduct2`。 `Creator` 是一个抽象类,声明了抽象方法 `FactoryMethod()`,它需要由继承 `Creator` 类的类来实现。

`ConcreteCreator1` 和 `ConcreteCreator2` 类扩展了 `Creator` 类并实现了工厂方法,分别创建 `ConcreteProduct1` 和 `ConcreteProduct2` 实例。

最后,在 `Main()` 方法内部,客户端代码创建 `ConcreteCreator1` 和 `ConcreteCreator2` 的实例,并调用 `UseProduct()` 方法,该方法在内部调用 `FactoryMethod()` 分别创建 `ConcreteProduct1` 和 `ConcreteProduct2` 的实例,然后调用它们的 `Execute()` 方法。

抽象创建者类不直接处理产品创建逻辑,它调用工厂方法来创建具体产品。因此,客户端代码与它实际操作的对象解耦,从而允许在创建对象类型方面具有灵活性。

现在,让我们看看工厂方法模式如何在实际示例中应用。

工厂方法设计模式的实际示例

考虑这样一种场景:您正在为应用程序开发一个数据分析引擎。该引擎需要处理来自不同数据库的数据,例如 SQL Server 和 Oracle。您可以使用工厂方法模式根据用户配置创建适当的数据库对象,而不是将引擎与特定的数据库实现紧密耦合。

示例:实际工厂方法实现
using System;
					
public class Program
{
	public static void Main()
	{
		DataAnalysisEngine dbEngine1 = new SqlServerDataAnalysisEngine();
		dbEngine1.ProcessData("Query to process data");
		
		DataAnalysisEngine dbEngine2 = new OracleDataAnalysisEngine();
		dbEngine1.ProcessData("Query to process data");

	}
}
//product
public interface IDatabase
{
    void Connect();
    void ExecuteQuery(string query);
}

// Concrete Product: SQL Server
public class SqlServerDatabase : IDatabase
{
    public void Connect()
    {
        Console.WriteLine("Connecting to SQL Server database...");
    }

    public void ExecuteQuery(string query)
    {
        Console.WriteLine("Executing query in SQL Server database: " + query);
    }
}

// Concrete Product: Oracle
public class OracleDatabase : IDatabase
{
    public void Connect()
    {
        Console.WriteLine("Connecting to Oracle database...");
    }

    public void ExecuteQuery(string query)
    {
        Console.WriteLine("Executing query in Oracle database: " + query);
    }
}


// Creator
public abstract class DataAnalysisEngine
{
    public abstract IDatabase CreateDatabase();

    public void ProcessData(string query)
    {
        IDatabase database = CreateDatabase();
        database.Connect();
        database.ExecuteQuery(query);
    }
}

// Concrete Creator: SQL Server
public class SqlServerDataAnalysisEngine : DataAnalysisEngine
{
    public override IDatabase CreateDatabase()
    {
        return new SqlServerDatabase();
    }
}

// Concrete Creator: Oracle
public class OracleDataAnalysisEngine : DataAnalysisEngine
{
    public override IDatabase CreateDatabase()
    {
        return new OracleDatabase();
    }
}
尝试一下

在上面的代码中,我们定义了一个产品接口 `IDatabase` 和两个具体产品类:`SqlServerDatabase` 和 `OracleDatabase`。 `DataAnalysisEngine` 是一个抽象类,它声明了工厂方法 `CreateDatabase()`,该方法返回 `IDatabase` 接口的实例。 `SqlServerDataAnalysisEngine` 和 `OracleDataAnalysisEngine` 是具体创建者类,它们扩展了创建者类 `DataAnalysisEngine` 并实现了工厂方法以创建相应的数据库对象。

现在,当您想要使用数据分析引擎处理数据时,您可以根据用户配置创建适当的具体创建者实例。然后,引擎将使用工厂方法创建相应的数据库对象并执行所需的操作。

使用工厂方法设计模式的优点

  • 它提供了一种将对象创建委托给子类的方法,确保创建者类不必知道它创建的对象的精确类。
  • 它允许轻松扩展,因为可以创建创建者的新子类而无需修改现有代码。
  • 它促进了代码重用,因为客户端代码可以处理产品接口的不同实例,而无需了解它们的具体实现。
  • 它促进了类之间的松散耦合,从而更容易替换产品的不同具体实现而不会影响客户端代码。
  • 它遵循开闭原则,允许轻松添加新类型的对象而无需修改现有代码。
  • 通过将对象创建逻辑与客户端代码分离,它提高了代码的可维护性和可读性。

总之,工厂方法设计模式是将对象创建逻辑与客户端代码解耦的强大工具。它允许子类决定实例化哪个类,为应用程序提供灵活性和可扩展性。通过了解工厂方法模式的组件和实际示例,您可以在 C# 项目中有效地应用它,以提高代码的可维护性和可伸缩性。

TUTORIALSTEACHER.COM

TutorialsTeacher.com 是您权威的技术教程来源,旨在通过循序渐进的方法,指导您掌握各种网络和其他技术。

我们的内容旨在帮助所有级别的学习者轻松快速地学习技术。访问此平台,即表示您已阅读并同意遵守我们的使用条款和隐私政策,这些条款和政策旨在保护您的体验和隐私权利。

[email protected]

关于我们使用条款隐私政策
copywrite-symbol

2024 TutorialsTeacher.com. (v 1.2) 版权所有。