C# 工厂方法模式

栏目总目录


概念

工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行。这种模式的主要目的是将对象的创建与使用解耦,使得系统更加灵活和可扩展。

角色

  1. Product(产品角色):定义了产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的共同父类或接口。

  2. Concrete Product(具体产品角色):实现了Product接口的具体类,被具体工厂类所创建。

  3. Creator(创建者角色):声明了工厂方法,该方法是一个返回Product类型对象的方法,但返回的Product类型对象是在子类中实现的。通常还提供一个用于创建产品对象的接口。

  4. Concrete Creator(具体创建者角色):实现了Creator接口中定义的工厂方法,返回一个Concrete Product实例。

好处

  1. 解耦:将产品的创建与使用解耦,使得系统更加灵活和可扩展。
  2. 符合开闭原则:新增产品类时,无需修改工厂类代码,只需新增具体产品类和具体工厂类即可。
  3. 提高灵活性:通过子类来决定创建哪个具体产品对象,可以在运行时动态地决定创建哪种产品对象。

应用场景

  1. 当一个类不知道它所必须创建的对象的类时。
  2. 当一个类希望由它的子类来指定它所创建的对象时。
  3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化时。

示例代码

csharp 复制代码
// Product 角色
public interface IDocument
{
    void Display();
}

// Concrete Product 角色
public class TextDocument : IDocument
{
    public void Display()
    {
        Console.WriteLine("Displaying Text Document");
    }
}

public class PDFDocument : IDocument
{
    public void Display()
    {
        Console.WriteLine("Displaying PDF Document");
    }
}

// Creator 角色
public interface IDocumentFactory
{
    IDocument CreateDocument();
}

// Concrete Creator 角色
public class TextDocumentFactory : IDocumentFactory
{
    public IDocument CreateDocument()
    {
        return new TextDocument();
    }
}

public class PDFDocumentFactory : IDocumentFactory
{
    public IDocument CreateDocument()
    {
        return new PDFDocument();
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        IDocumentFactory factory1 = new TextDocumentFactory();
        IDocument doc1 = factory1.CreateDocument();
        doc1.Display(); // 输出:Displaying Text Document

        IDocumentFactory factory2 = new PDFDocumentFactory();
        IDocument doc2 = factory2.CreateDocument();
        doc2.Display(); // 输出:Displaying PDF Document
    }
}

总结

工厂方法模式是一种非常有用的创建型设计模式,它通过定义一个创建对象的接口(即工厂接口),但将具体创建对象的任务交给子类去完成。这种模式的主要优点在于它将对象的创建与使用分离,降低了系统的耦合度,增加了系统的灵活性和可扩展性。

相关推荐
孬甭_3 分钟前
C++ vector
开发语言·c++
AOwhisky27 分钟前
Python 学习笔记(第五期)——组合数据类型:列表、元组、集合与字典精讲——核心知识点自测与详解
开发语言·笔记·python·学习·云计算
czhc114007566337 分钟前
722:零侵入;DBG;
c#
灯澜忆梦9 小时前
GO_并发编程---定时器
开发语言·后端·golang
-银雾鸢尾-10 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-10 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白11 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
段一凡-华北理工大学13 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
Ljwuhe13 小时前
C++——多态
开发语言·c++
心平气和量大福大14 小时前
C#-WPF-Window主窗体
开发语言·c#·wpf