建造者(Builder)模式也叫生成器模式。用它来创建对象,目的是省去在对象发生变化时,需要修改代码中每一处对象创建的地方,应用这种模式,可以在一个复杂对象的内部结构(由许多其他子对象构成的结构)发生变化时,仅需要对对象有所修改,而复杂对象与其他的对象之间的关系、行为不需要进行修改。
GOF:将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

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

被折叠的 条评论
为什么被折叠?



