在软件系统中,有时面临着一个复杂对象的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的
各个部分经常面临着剧烈的变化,但是将它们
组合在一起的算法却相对
稳定。如何提供一种"封装机制"来隔离出"各个部分"的变化,从而保持系统中的"稳定构建算法"不随需求的改变而改变?
建造者(Builder)模式也叫生成器模式。用它来创建对象,目的是省去在对象发生变化时,需要修改代码中每一处对象创建的地方,应用这种模式,可以在一个复杂对象的内部结构(由许多其他子对象构成的结构)发生变化时,仅需要对对象有所修改,而复杂对象与其他的对象之间的关系、行为不需要进行修改。
GOF:将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

举例来说, 假设有一台没有安装任何系统的苹果macbook笔记本,现在要“创建”一种集上网浏览网页,聊天和看电影这三种最基本功能的应用系统。
这里我们可以给出两种不同的实现途径:1、安装windows操作系统,使用firefox浏览器,windows版本的qq和暴风影音。2、安装macintosh操作系统,使用mac版本下的firefox浏览器,luma qq和暴风影音。
分析上面的两种途径,我们发现,构建系统时,操作系统,浏览器软件,聊天软件和视频软件组合到一起的
算法相对稳定,但是任一种途径中,它们使用的软件(包括浏览器,聊天工具和视频软件)都会面临着
剧烈的变化(比如浏览器,不管windows还是mac系统,都可能改变为使用google浏览器等)。毫无疑问,我们会利用建造者模式来应对
构成复杂但构成结构和顺序相对稳定的对象的创建工作。
看实现代码:

Code
using System;
using System.Collections;
using System.Collections.Generic;
namespace BuilderPattern
{
/*应用系统和组成的子系统对应抽象类*/
//应用系统
public abstract class AppSystem
{
public abstract void SaySomething();
}
//操作系统
public abstract class OS
{
}
//浏览器
public abstract class Browser
{
}
//聊天软件
public abstract class ChatTool
{
}
//观看视频软件
public abstract class VideoTool
{
}
//windows应用系统
public class WindowsAppSystem:AppSystem
{
public override void SaySomething()
{
Console.WriteLine("You created a best system of the world.");
}
}
//macintosh应用系统
public class MacintoshAppSystem:AppSystem
{
public override void SaySomething()
{
Console.WriteLine("You did really created a best system of the world.");
}
}
//应用系统Builder类
public abstract class AppBuilder
{
public abstract void BuildOS();
public abstract void BuildBrowser();
public abstract void BuildChatTool();
public abstract void BuildVideoTool();
public abstract AppSystem GetAppSystem(); //返回一个应用系统
}
//具体应用系统Builder类 --windows应用系统
public class WindowsAppBuilder : AppBuilder
{
private AppSystem winApp = new WindowsAppSystem();
public override void BuildOS()
{
Console.WriteLine("i choose windows vista as my system:");
}
public override void BuildBrowser()
{
Console.WriteLine("ie is default browser,but i choose firefox.");
}
public override void BuildChatTool()
{
Console.WriteLine("msn is default chat tool,but i choose qq.");
}
public override void BuildVideoTool()
{
Console.WriteLine("wmp is default video tool,but i choose bfyy.");
}
public override AppSystem GetAppSystem()
{
return winApp;
}
}
//具体应用系统Builder类 --mac应用系统
public class MacintoshAppBuilder : AppBuilder
{
private AppSystem macApp = new MacintoshAppSystem();
public override void BuildOS()
{
Console.WriteLine("i choose mac os x as my system:");
}
public override void BuildBrowser()
{
Console.WriteLine("safari is default browser,but i choose firefox.");
}
public override void BuildChatTool()
{
Console.WriteLine("ichat is default chat tool,but i choose luma qq.");
}
public override void BuildVideoTool()
{
Console.WriteLine("quicktime is default video tool,but i choose bfyy.");
}
public override AppSystem GetAppSystem()
{
return macApp;
}
}
public class Director
{
//这个方法用来“指导”建造一种应用系统(最常用)
public void Construct(AppBuilder builder)
{
builder.BuildOS();
builder.BuildBrowser();
builder.BuildChatTool();
builder.BuildVideoTool();
}
//返回一种具体的应用系统
public AppSystem ConstructAppSystem(AppBuilder builder)
{
builder.BuildOS();
builder.BuildBrowser();
builder.BuildChatTool();
builder.BuildVideoTool();
return builder.GetAppSystem();
}
}
//客户端调用
public class Program
{
static void Main()
{
AppBuilder appBuilder = new WindowsAppBuilder(); //实际项目中,都是通过配置文件然后反射决定生成那一种
Director director = new Director();
director.Construct(appBuilder);
Console.WriteLine("----------------------------------------------");
//下面建造一种具体的应用系统
AppSystem system = director.ConstructAppSystem(new MacintoshAppBuilder());
Console.WriteLine("----------------------------------------------");
system.SaySomething();
}
}
} 最后:正如你所看到的,一个应用系统的构成都是由其子系统(从操作系统到相关软件)组合(Composite)而来的,所以建造者模式和组合模式有很多联系,通常它们都结合在一起使用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构