// 抽象产品接口
public interface IButton { void Render(); }
public interface ITextBox { void Display(); }
// 具体产品(Windows家族)
public class WindowsButton : IButton {
public void Render() => Console.WriteLine("Windows风格按钮");
}
public class WindowsTextBox : ITextBox {
public void Display() => Console.WriteLine("Windows风格文本框");
}
// 抽象工厂接口
public interface IUIFactory {
IButton CreateButton();
ITextBox CreateTextBox();
}
// 具体工厂实现
public class WindowsUIFactory : IUIFactory {
public IButton CreateButton() => new WindowsButton();
public ITextBox CreateTextBox() => new WindowsTextBox();
}
// 客户端调用
var factory = new WindowsUIFactory();
var button = factory.CreateButton();
button.Render(); // 输出:Windows风格按钮
(2)设计原则
开闭原则:通过扩展(新增工厂类)而非修改现有代码支持新功能。
依赖倒置原则:高层模块依赖抽象接口而非具体实现。
(3)实战案例
需求:支持不同品牌(Benz、BMW)生产引擎和轮胎组件。
csharp复制代码
// 抽象产品
public interface IEngine { void Start(); }
public interface ITyre { void Inflate(); }
// 具体产品(Benz家族)
public class BenzEngine : IEngine {
public void Start() => Console.WriteLine("Benz引擎启动");
}
public class BenzTyre : ITyre {
public void Inflate() => Console.WriteLine("Benz轮胎充气");
}
// 抽象工厂接口
public interface ICarFactory {
IEngine CreateEngine();
ITyre CreateTyre();
}
// 具体工厂(Benz工厂)
public class BenzFactory : ICarFactory {
public IEngine CreateEngine() => new BenzEngine();
public ITyre CreateTyre() => new BenzTyre();
}
// 客户端调用
ICarFactory factory = new BenzFactory();
var engine = factory.CreateEngine();
engine.Start(); // 输出:Benz引擎启动
// 1. 产品类:Computer
public class Computer {
public string CPU { get; set; }
public string Motherboard { get; set; }
public string RAM { get; set; }
public string Storage { get; set; }
public void DisplaySpecs() {
Console.WriteLine($"CPU: {CPU}\n主板: {Motherboard}\n内存: {RAM}\n存储: {Storage}");
}
}
// 2. 抽象建造者:IComputerBuilder
public interface IComputerBuilder {
void SetCPU(string cpu);
void SetMotherboard(string motherboard);
void SetRAM(string ram);
void SetStorage(string storage);
Computer GetComputer();
}
// 3. 具体建造者:GamingComputerBuilder
public class GamingComputerBuilder : IComputerBuilder {
private Computer _computer = new Computer();
public void SetCPU(string cpu) => _computer.CPU = cpu;
public void SetMotherboard(string motherboard) => _computer.Motherboard = motherboard;
public void SetRAM(string ram) => _computer.RAM = ram;
public void SetStorage(string storage) => _computer.Storage = storage;
public Computer GetComputer() => _computer;
}
// 4. 指挥者(可选):ComputerDirector
public class ComputerDirector {
public Computer Build(IComputerBuilder builder) {
builder.SetCPU("Intel i9");
builder.SetMotherboard("Z690");
builder.SetRAM("32GB DDR5");
builder.SetStorage("1TB NVMe SSD");
return builder.GetComputer();
}
}
// 客户端调用
var builder = new GamingComputerBuilder();
var director = new ComputerDirector();
var gamingPC = director.Build(builder);
gamingPC.DisplaySpecs();
(2)绘制人物
应用场景: 图形界面中分步绘制复杂图形
csharp复制代码
// 1. 抽象建造者:PersonBuilder
public abstract class PersonBuilder {
protected Graphics Graphics { get; }
protected Pen Pen { get; }
public PersonBuilder(Graphics g, Pen p) {
Graphics = g;
Pen = p;
}
public abstract void BuildHead();
public abstract void BuildBody();
public abstract void BuildArms();
public abstract void BuildLegs();
}
// 2. 具体建造者:PersonThinBuilder
public class PersonThinBuilder : PersonBuilder {
public PersonThinBuilder(Graphics g, Pen p) : base(g, p) {}
public override void BuildHead() => Graphics.DrawEllipse(Pen, 50, 20, 30, 30);
public override void BuildBody() => Graphics.DrawRectangle(Pen, 60, 50, 10, 50);
public override void BuildArms() => Graphics.DrawLine(Pen, 60, 50, 40, 100);
public override void BuildLegs() => Graphics.DrawLine(Pen, 60, 100, 50, 150);
}
// 3. 客户端调用(Windows窗体示例)
var bitmap = new Bitmap(200, 200);
using (var g = Graphics.FromImage(bitmap)) {
var pen = new Pen(Color.Black);
var builder = new PersonThinBuilder(g, pen);
builder.BuildHead();
builder.BuildBody();
builder.BuildArms();
builder.BuildLegs();
}
pictureBox.Image = bitmap;
(3)链式调用
通过链式方法调用简化客户端代码,常见于配置类库(如HTTP请求构建)
csharp复制代码
public class Car {
public string Engine { get; set; }
public int Wheels { get; set; }
public string Color { get; set; }
}
public class CarBuilder {
private Car _car = new Car();
public CarBuilder SetEngine(string engine) { _car.Engine = engine; return this; }
public CarBuilder SetWheels(int wheels) { _car.Wheels = wheels; return this; }
public CarBuilder SetColor(string color) { _car.Color = color; return this; }
public Car Build() => _car;
}
// 客户端调用
var car = new CarBuilder()
.SetEngine("V8")
.SetWheels(4)
.SetColor("Red")
.Build();
3、进阶技巧
(1)省略Director
直接通过客户端调用Builder方法(适用于简单流程)。
(2)参数校验
在Build()方法中加入校验逻辑,确保对象完整性。
csharp复制代码
public Car Build() {
if (_car.Wheels < 4) throw new ArgumentException("车轮不足");
return _car;
}
(3)不可变对象
通过私有构造函数 + Builder实现(线程安全)。
csharp复制代码
public class ImmutableCar {
public string Engine { get; }
private ImmutableCar(CarBuilder builder) {
Engine = builder.Engine;
}
public class CarBuilder {
public string Engine { get; set; }
public ImmutableCar Build() => new ImmutableCar(this);
}
}
// 抽象产品接口:ILog
public interface ILog
{
void Write(string message);
}
// 具体产品:文件日志
public class FileLog : ILog
{
public void Write(string message)
{
Console.WriteLine($"FileLog: {message}");
}
}
// 具体产品:事件日志
public class EventLog : ILog
{
public void Write(string message)
{
Console.WriteLine($"EventLog: {message}");
}
}
(2)定义抽象与具体工厂
csharp复制代码
// 抽象工厂接口:ILogFactory
public interface ILogFactory
{
ILog CreateLog();
}
// 具体工厂:文件日志工厂
public class FileLogFactory : ILogFactory
{
public ILog CreateLog()
{
return new FileLog();
}
}
// 具体工厂:事件日志工厂
public class EventLogFactory : ILogFactory
{
public ILog CreateLog()
{
return new EventLog();
}
}
(3)客户端调用
csharp复制代码
class Program
{
static void Main(string[] args)
{
// 通过具体工厂创建产品
ILogFactory factory = new FileLogFactory();
ILog logger = factory.CreateLog();
logger.Write("Test message"); // 输出:FileLog: Test message
// 切换工厂类型
factory = new EventLogFactory();
logger = factory.CreateLog();
logger.Write("Test message"); // 输出:EventLog: Test message
}
}
(4)模式扩展:新增类型
若需支持数据库日志,只需添加新的产品类和工厂类,而无需修改原有代码:
csharp复制代码
// 新增具体产品:数据库日志
public class DatabaseLog : ILog
{
public void Write(string message)
{
Console.WriteLine($"DatabaseLog: {message}");
}
}
// 新增具体工厂:数据库日志工厂
public class DatabaseLogFactory : ILogFactory
{
public ILog CreateLog()
{
return new DatabaseLog();
}
}
3、进阶技巧
(1)结合依赖注入
通过IoC容器管理工厂和产品的生命周期。
(2)泛型工厂
利用C#泛型简化工厂类的实现。
csharp复制代码
public interface IGenericFactory<T> where T : ILog, new()
{
T Create() => new T();
}