跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C#算法

C#设计模式:工厂方法模式详解

工厂方法模式定义创建产品对象的接口,将实例化推迟到子类。核心角色包括抽象工厂、具体工厂、抽象产品和具体产品。相比简单工厂模式,它符合开放封闭原则,扩展新产品时无需修改原有代码。示例展示了通过 Creator 子类创建不同 Light 对象的过程。该模式依赖多态性,若返回具体类型则发生退化。常与模板方法、享元等模式配合使用。

念念不忘发布于 2025/1/19更新于 2026/9/1065 浏览
C#设计模式:工厂方法模式详解

工厂方法(Factory Method)模式

一、工厂方法(Factory Method)模式

工厂方法(Factory Method)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。

工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。

在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

在 Factory Method 模式中,工厂类与产品类往往具有平行的等级结构,它们之间一一对应。

二、Factory Method 模式角色与结构

抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

具体工厂(ConcreteCreator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

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

具体产品(ConcreteProduct)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

三、程序举例

using System;

public abstract class Light
{
    public abstract void TurnOn();
    public abstract void TurnOff();
}

public class BulbLight : Light
{
    public override void TurnOn()
    {
        Console.WriteLine("Bulb Light is Turned on");
    }
    public override void TurnOff()
    {
        Console.WriteLine("Bulb Light is Turned off");
    }
}

public class TubeLight : Light
{
       ()
    {
        Console.WriteLine();
    }
    
    {
        Console.WriteLine();
    }
}

   
{
    ;
}

   : 
{
    
    {
          BulbLight();
    }
}

   : 
{
    
    {
          TubeLight();
    }
}

  
{
    
    {
        Creator c1 =  BulbCreator();
        Creator c2 =  TubeCreator();
        Light l1 = c1.factory();
        Light l2 = c2.factory();
        l1.TurnOn();
        l1.TurnOff();
        Console.WriteLine();
        l2.TurnOn();
        l2.TurnOff();
    }
}
public
override
void
TurnOn
"Tube Light is Turned on"
public override void TurnOff()
"Tube Light is Turned off"
public
abstract
class
Creator
public abstract Light factory()
public
class
BulbCreator
Creator
public override Light factory()
return
new
public
class
TubeCreator
Creator
public override Light factory()
return
new
public
class
Client
public static void Main()
new
new
"-----------------"

活动过程包括:客户端创建 BulbCreator 对象,客户端持有此对象的类型是 Creator,而实际类型是 BulbCreator。然后客户端调用 BulbCreator 的 factory 方法,之后 BulbCreator 调用 BulbLight 的构造函数创造出产品 BulbLight 对象。

四、工厂方法模式与简单工厂模式

工厂方法模式与简单工厂模式在结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。

工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。

当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了'开放-封闭'原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。

工厂方法模式退化后可以演变成简单工厂模式。

五、Factory Method 模式演化

使用接口或抽象类

抽象工厂角色和抽象工厂角色都可以选择由接口或抽象类实现。

使用多个工厂方法

抽象工厂角色可以规定出多于一个的工厂方法,从而使具体工厂角色实现这些不同的工厂方法,这些方法可以提供不同的商业逻辑,以满足提供不同的产品对象的任务。

产品的循环使用

工厂方法总是调用产品类的构造函数以创建一个新的产品实例,然后将这个实例提供给客户端。而在实际情形中,工厂方法所做的事情可以相当复杂。

一个常见的复杂逻辑就是循环使用产品对象。工厂对象将已经创建过的产品登记到一个聚集中,然后根据客户所请求的产品状态,向聚集查询。如果有满足要求的产品对象,就直接将产品返回客户端;如果聚集中没有这样的产品对象,那么就创建一个新的满足要求的产品对象,然后将这个对象登记到聚集中,再返还给客户端。'享元模式(Flyweight Pattern)'就是这样一个模式。

多态性的丧失和模式的退化

一个工厂方法模式的实现依赖于工厂角色和产品角色的多态性。在有些情况下,这个模式可以出现退化。

工厂方法返回的类型应当是抽象类型,而不是具体类型。调用工厂方法的客户端应当依赖抽象产品编程,而不是具体产品。如果工厂仅仅返回一个具体产品对象,便违背了工厂方法的用意,发生退化,这时就不再是工厂模式了。

工厂的等级结构:工厂对象应当有一个抽象的超类型。如果等级结构中只有一个具体工厂类的话,抽象工厂就可以省略,发生了退化。

六、Factory Method 模式与其它模式的关系

与工厂方法模式有关的模式还包括:模板方法模式、MVC 模式、享元模式、备忘录模式。

七、另外一个例子

// Factory Method pattern -- Real World example
using System;
using System.Collections;

// Product
abstract class Page {}

// ConcreteProduct
class SkillsPage : Page {}
class EducationPage : Page {}
class ExperiencePage : Page {}
class IntroductionPage : Page {}
class ResultsPage : Page {}
class ConclusionPage : Page {}
class SummaryPage : Page {}
class BibliographyPage : Page {}

// Creator
abstract class Document
{
    protected ArrayList pages = new ArrayList();

    public Document()
    {
        this.CreatePages();
    }

    public ArrayList Pages
    {
        get { return pages; }
    }

    abstract public void CreatePages();
}

// ConcreteCreator
class Resume : Document
{
    override public void CreatePages()
    {
        pages.Add(new SkillsPage());
        pages.Add(new EducationPage());
        pages.Add(new ExperiencePage());
    }
}

class Report : Document
{
    override public void CreatePages()
    {
        pages.Add(new IntroductionPage());
        pages.Add(new ResultsPage());
        pages.Add(new ConclusionPage());
        pages.Add(new SummaryPage());
        pages.Add(new BibliographyPage());
    }
}

class FactoryMethodApp
{
    public static void Main(string[] args)
    {
        Document[] docs = new Document[2];
        docs[0] = new Resume();
        docs[1] = new Report();

        foreach (Document document in docs)
        {
            Console.WriteLine(document + " ------- ");
            foreach (Page page in document.Pages)
                Console.WriteLine(page);
        }
    }
}

目录

  1. 工厂方法(Factory Method)模式

更多推荐文章

查看全部
  • 1Panel 部署 Node+MongoDB+Nginx 项目实操及避坑指南
  • Wine跨平台兼容性解析:在Linux和macOS运行Windows程序
  • 次模函数与机器学习中的离散优化
  • Nano Banana:AI 图像生成与编辑技术详解
  • Web 自动化测试入门:从概念到百度搜索实战
  • Python 彻底卸载与清理教程
  • GitHub Copilot 接入第三方 OpenAI 兼容模型及去除安全限制方法
  • MySQL DQL 全面解析
  • Stable Diffusion 图生视频实战:从一张图到一段动画
  • OpenClaw 架构解析:实现从认知到行动的 AI 智能体
  • 递归算法核心:二叉树遍历与结构判断实现
  • Seedance 2.0 双分支扩散变换器架构深度解析与工程实现
  • OpenClaw 在 Windows WSL 环境下的部署与飞书配置指南
  • AI 全栈开发:利用 AI 工具降低门槛与赋能个体创业
  • Java Web 自研框架 18 年架构决策复盘与核心思路
  • Linux 环境下 OpenClaw 安装、初始化与 Web UI 配置指南
  • 基于强化学习的无标记 RAG 增强型 LLM 智能故障诊断
  • LiuJuan20260223Zimage 镜像结构解析:目录布局、日志路径与模型权重规范
  • 创建 GitHub 私人仓库并上传本地项目的完整步骤
  • Ubuntu Server 22.04 LTS 系统安装教程

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online