你是否曾经为了创建不同类型的窗体而写了一堆重复代码?每次新增窗体都要修改调用代码,维护起来头疼不已?作为一名资深C#开发者,我发现很多同行在构建企业级WinForms应用时,都会遇到窗体管理混乱、代码耦合度高的问题。
今天,我将通过一个完整的工业生产管理系统案例,手把手教你如何用简单工厂模式优雅地解决这些痛点,让你的代码更加清晰、可维护。文章末尾还有完整的可运行项目代码,绝对干货满满!
C#// 传统方式:到处都是这样的代码
private void button1_Click(object sender, EventArgs e)
{
var form = new DeviceMonitorForm();
form.Show();
}
private void button2_Click(object sender, EventArgs e)
{
var form = new DataAnalysisForm();
form.Show();
}
// 更多重复代码...
当需要给所有窗体添加统一的初始化逻辑时,你需要修改每个创建窗体的地方,工作量巨大。
新增窗体类型时,需要在多个地方修改代码,违反了开闭原则。

简单工厂模式通过一个工厂类来封装对象的创建逻辑,让客户端只需要知道"要什么",而不需要知道"怎么创建"。
C#using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AppFormFactoryIndustrial.Enums
{
public enum FormType
{
/// <summary>
/// 设备监控窗体
/// </summary>
DeviceMonitor,
/// <summary>
/// 数据分析窗体
/// </summary>
DataAnalysis,
/// <summary>
/// 系统配置窗体
/// </summary>
SystemConfig
}
}
C#using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AppFormFactoryIndustrial.Enums;
using AppFormFactoryIndustrial.Forms;
namespace AppFormFactoryIndustrial.Factory
{
/// <summary>
/// 窗体工厂类 - 简单工厂模式
/// </summary>
public static class FormFactory
{
/// <summary>
/// 创建指定类型的窗体
/// </summary>
/// <param name="formType">窗体类型</param>
/// <returns>创建的窗体实例</returns>
public static Form CreateForm(FormType formType)
{
switch (formType)
{
case FormType.DeviceMonitor:
return new FrmDeviceMonitor();
case FormType.DataAnalysis:
return new FrmDataAnalysis();
case FormType.SystemConfig:
return new FrmSystemConfig();
default:
throw new ArgumentException($"不支持的窗体类型: {formType}");
}
}
/// <summary>
/// 创建并显示指定类型的窗体
/// </summary>
/// <param name="formType">窗体类型</param>
/// <param name="isModal">是否模态显示</param>
public static void ShowForm(FormType formType, bool isModal = false)
{
var form = CreateForm(formType);
if (isModal)
{
form.ShowDialog();
}
else
{
form.Show();
}
}
}
}
C#using AppFormFactoryIndustrial.Enums;
using AppFormFactoryIndustrial.Factory;
namespace AppFormFactoryIndustrial
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
private void btnDeviceMonitor_Click(object sender, EventArgs e)
{
// 使用工厂创建设备监控窗体
FormFactory.ShowForm(FormType.DeviceMonitor);
}
private void btnDataAnalysis_Click(object sender, EventArgs e)
{
// 使用工厂创建数据分析窗体
FormFactory.ShowForm(FormType.DataAnalysis);
}
private void btnSystemConfig_Click(object sender, EventArgs e)
{
// 使用工厂创建系统配置窗体
FormFactory.ShowForm(FormType.SystemConfig, true); // 模态显示
}
private void btnExit_Click(object sender, EventArgs e)
{
if (MessageBox.Show("确定要退出系统吗?", "确认退出",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
Application.Exit();
}
}
}
}
让我们看一个完整的设备监控窗体实现,展示工业级应用的UI设计:
C#using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AppFormFactoryIndustrial.Forms
{
public partial class FrmDeviceMonitor : Form
{
public FrmDeviceMonitor()
{
InitializeComponent();
InitializeData();
}
private void InitializeData()
{
// 初始化设备列表
cmbDeviceList.Items.AddRange(new string[]
{
"生产线A", "生产线B", "包装机1", "包装机2",
"检测设备1", "检测设备2", "传送带1", "传送带2"
});
cmbDeviceList.SelectedIndex = 0;
// 初始化状态
UpdateDeviceStatus();
// 启动定时器模拟实时数据更新
tmrUpdate.Start();
}
private void UpdateDeviceStatus()
{
Random rand = new Random();
// 模拟温度数据
nudTemperature.Value = (decimal)(20 + rand.NextDouble() * 50);
// 模拟压力数据
nudPressure.Value = (decimal)(1 + rand.NextDouble() * 9);
// 模拟运行状态
lblStatus.Text = rand.Next(0, 10) > 7 ? "异常" : "正常";
lblStatus.ForeColor = lblStatus.Text == "正常" ? Color.Green : Color.Red;
// 更新进度条
pgbEfficiency.Value = rand.Next(60, 100);
}
private void btnStartMonitor_Click(object sender, EventArgs e)
{
tmrUpdate.Enabled = !tmrUpdate.Enabled;
btnStartMonitor.Text = tmrUpdate.Enabled ? "停止监控" : "开始监控";
btnStartMonitor.BackColor = tmrUpdate.Enabled ? Color.OrangeRed : Color.LimeGreen;
}
private void cmbDeviceList_SelectedIndexChanged(object sender, EventArgs e)
{
UpdateDeviceStatus();
}
private void tmrUpdate_Tick(object sender, EventArgs e)
{
UpdateDeviceStatus();
}
}
}




在工业项目中,规范的命名至关重要:
C#// 按钮命名示例
Button btnStartMonitor; // btn + 功能描述
Button btnStopMonitor;
// 文本框命名示例
TextBox txtServerIP; // txt + 数据含义
TextBox txtConnectionString;
// 下拉框命名示例
ComboBox cmbDeviceList; // cmb + 列表内容
ComboBox cmbAnalysisType;
// 数据网格命名示例
DataGridView dgvAnalysisResult; // dgv + 数据类型
C#// 改进版工厂方法 - 支持单例模式
public class FormFactory
{
private static readonly Dictionary<FormType, Form> _instances
= new Dictionary<FormType, Form>();
public static Form CreateForm(FormType formType, bool singleton = false)
{
if (singleton && _instances.ContainsKey(formType))
{
var existingForm = _instances[formType];
if (!existingForm.IsDisposed)
return existingForm;
}
var form = CreateFormInternal(formType);
if (singleton)
_instances[formType] = form;
return form;
}
}
简单工厂模式不仅适用于窗体创建,还可以应用于:
C#// 扩展示例:数据访问工厂
public static class DataAccessFactory
{
public static IDataAccess CreateDataAccess(DatabaseType dbType)
{
switch (dbType)
{
case DatabaseType.SqlServer:
return new SqlServerDataAccess();
case DatabaseType.MySQL:
return new MySqlDataAccess();
default:
throw new NotSupportedException($"不支持的数据库类型: {dbType}");
}
}
}
通过本文的实战演练,我们掌握了三个核心要点:
简单工厂模式虽然简单,但在实际项目中威力巨大。它不仅让我们的代码更加优雅,还为后续的功能扩展奠定了良好基础。当你的项目需要管理大量相似对象时,不妨试试这个模式!
💬 互动讨论
你在项目中还遇到过哪些适合用工厂模式解决的场景?在WinForms开发中有哪些让你头疼的问题?欢迎在评论区分享你的经验和困惑!
🔥 觉得有用请转发给更多同行,让更多C#开发者受益!
关注我,获取更多C#开发实战技巧和最佳实践分享!
相关信息
通过网盘分享的文件:AppFormFactoryIndustrial.zip 链接: https://pan.baidu.com/s/1d6pltXoOE9T6fTeUqECm9A?pwd=xv5i 提取码: xv5i --来自百度网盘超级会员v9的分享
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!