C#设计模式系列:建造者模式(Builder)
1 建造者模式简介
1.1 定义
建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
1.2 使用频率
中低
2 建造者模式结构
2.1 结构图

2.2 参与者
建造者模式参与者:
◊ Builder:为创建一个Product对象的各个部件指定抽象接口;
◊ ConcreteBuilder
° 实现Builder的接口以构造和装配该产品的各个部件
° 定义并明确它所创建的表示
° 提供一个检索Product的接口
◊ Director:构造一个使用Builder接口的对象;
◊ Product
° 表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程
° 包含定义组成部件的类,包括将这些部件装配成最终产品的接口
在建造者模式中,Director规定了创建一个对象所需要的步骤和次序,Builder则提供了一些列完成这些步骤的方法,ConcreteBuilder给出了这些方法的具体实现,是对象的直接创建者。
3 建造者模式结构实现

Product.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Structural
{
public class Product
{
private List<string> _parts = new List<string>(); public void Add(string part)
{
_parts.Add(part);
} public void Show()
{
Console.WriteLine("Product Parts");
foreach (string part in _parts)
{
Console.WriteLine(part);
}
}
}
}
Builder.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Structural
{
public abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
}
ConcreteBuilder1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Structural
{
public class ConcreteBuilder1 : Builder
{
private Product _product = new Product(); public override void BuildPartA()
{
_product.Add("PartA");
} public override void BuildPartB()
{
_product.Add("PartB");
} public override Product GetResult()
{
return _product;
}
}
}
ConcreteBuilder2.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Structural
{
public class ConcreteBuilder2 : Builder
{
private Product _product = new Product(); public override void BuildPartA()
{
_product.Add("PartX");
} public override void BuildPartB()
{
_product.Add("PartY");
} public override Product GetResult()
{
return _product;
}
}
}
Director.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Structural
{
public class Director
{
/// <summary>
/// Builder uses a complex series of steps
/// </summary>
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.BuilderPattern.Structural; namespace DesignPatterns.BuilderPattern
{
class Program
{
static void Main(string[] args)
{
// Create director and builders
Director director = new Director(); Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2(); // Construct two products
director.Construct(b1);
Product p1 = b1.GetResult();
p1.Show(); director.Construct(b2);
Product p2 = b2.GetResult();
p2.Show();
}
}
}
运行输出:
Product Parts
PartA
PartB
Product Parts
PartX
PartY
请按任意键继续. . .
4、建造者模式实践应用

Vehicle.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Practical
{
/// <summary>
/// The 'Product' class
/// </summary>
public class Vehicle
{
private string _vehicleType;
private Dictionary<string, string> _parts = new Dictionary<string, string>(); /// <summary>
/// Constructor
/// </summary>
public Vehicle(string vehicleType)
{
this._vehicleType = vehicleType;
} /// <summary>
/// Indexer
/// </summary>
public string this[string key]
{
get { return _parts[key]; }
set { _parts[key] = value; }
} public void Show()
{
Console.WriteLine("\n---------------------------");
Console.WriteLine("Vehicle Type: {0}", _vehicleType);
Console.WriteLine(" Frame : {0}", _parts["frame"]);
Console.WriteLine(" Engine : {0}", _parts["engine"]);
Console.WriteLine(" #Wheels: {0}", _parts["wheels"]);
Console.WriteLine(" #Doors : {0}", _parts["doors"]);
}
}
}
VehicleBuilder.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Practical
{
/// <summary>
/// The 'Builder' abstract class
/// </summary>
public abstract class VehicleBuilder
{
protected Vehicle vehicle; // Gets vehicle instance
public Vehicle Vehicle
{
get { return vehicle; }
} // Abstract build methods
public abstract void BuildFrame();
public abstract void BuildEngine();
public abstract void BuildWheels();
public abstract void BuildDoors();
}
}
MotorCycleBuilder.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Practical
{
public class MotorCycleBuilder : VehicleBuilder
{
public MotorCycleBuilder()
{
vehicle = new Vehicle("MotorCycle");
} public override void BuildFrame()
{
vehicle["frame"] = "MotorCycle Frame";
} public override void BuildEngine()
{
vehicle["engine"] = "500 cc";
} public override void BuildWheels()
{
vehicle["wheels"] = "";
} public override void BuildDoors()
{
vehicle["doors"] = "";
}
}
}
CarBuilder.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Practical
{
public class CarBuilder : VehicleBuilder
{
public CarBuilder()
{
vehicle = new Vehicle("Car");
} public override void BuildFrame()
{
vehicle["frame"] = "Car Frame";
} public override void BuildEngine()
{
vehicle["engine"] = "2500 cc";
} public override void BuildWheels()
{
vehicle["wheels"] = "";
} public override void BuildDoors()
{
vehicle["doors"] = "";
}
}
}
ScooterBuilder.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Practical
{
public class ScooterBuilder : VehicleBuilder
{
public ScooterBuilder()
{
vehicle = new Vehicle("Scooter");
} public override void BuildFrame()
{
vehicle["frame"] = "Scooter Frame";
} public override void BuildEngine()
{
vehicle["engine"] = "50 cc";
} public override void BuildWheels()
{
vehicle["wheels"] = "";
} public override void BuildDoors()
{
vehicle["doors"] = "";
}
}
}
Shop.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Practical
{
public class Shop
{
public void Construct(VehicleBuilder vehicleBuilder)
{
vehicleBuilder.BuildFrame();
vehicleBuilder.BuildEngine();
vehicleBuilder.BuildWheels();
vehicleBuilder.BuildDoors();
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.BuilderPattern.Practical; namespace DesignPatterns.BuilderPattern
{
class Program
{
static void Main(string[] args)
{
VehicleBuilder builder;
// Create shop with vehicle builders
Shop shop = new Shop(); // Construct and display vehicles
builder = new ScooterBuilder();
shop.Construct(builder);
builder.Vehicle.Show(); builder = new CarBuilder();
shop.Construct(builder);
builder.Vehicle.Show(); builder = new MotorCycleBuilder();
shop.Construct(builder);
builder.Vehicle.Show();
}
}
}
运行输出:
---------------------------
Vehicle Type: Scooter
Frame : Scooter Frame
Engine : cc
#Wheels:
#Doors : ---------------------------
Vehicle Type: Car
Frame : Car Frame
Engine : cc
#Wheels:
#Doors : ---------------------------
Vehicle Type: MotorCycle
Frame : MotorCycle Frame
Engine : cc
#Wheels:
#Doors :
请按任意键继续. . .
5 建造者模式应用分析
建造者模式适用情形:
◊ 需要生成的产品对象有复杂的内部结构
◊ 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序
◊ 在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到
建造者模式特点:
◊ 建造者模式的使用使得产品的内部表对象可以独立地变化。使用建造者模式可以使客户不必知道产品内部组成的细节
◊ 每一个Builder都相对独立,而与其他Builder无关
◊ 可使对构造过程更加精细控制
◊ 将构建代码和表示代码分开
◊ 建造者模式的缺点在于难于应付分步骤构建算法的需求变动
C#设计模式系列:建造者模式(Builder)的更多相关文章
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 【设计模式】建造者模式 Builder Pattern
前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...
- 二十四种设计模式:建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...
- 设计模式之建造者模式——Builder
一.概述 Builder模式,中文名为建造者模式,又名生成器模式.构建者模式等,是创建型设计模式之一.用于将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 1.适用性: 对象 ...
- 设计模式-05建造者模式(Builder Pattern)
1.模式动机 比如我们要组装一台电脑,都知道电脑是由 CPU.主板.内存.硬盘.显卡.机箱.显示器.键盘和鼠标组成,其中非常重要的一点就是这些硬件都是可以灵活选择,但是组装步骤都是大同小异(可以组一个 ...
- 设计模式之建造者模式(Builder)
建造者模式原理:建造模式主要是用于产生对象的各个组成部分,而抽象工厂模式则用于产生一系列对象,建造者模式而且要求这些对象的组成部分有序. 代码如下: #include <iostream> ...
- 设计模式之建造者模式Builder(创建型)
1. 概述 在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定 ...
- Python 设计模式之建造者模式 Builder Pattern
#引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...
- 【UE4 设计模式】建造者模式 Builder Pattern
概述 描述 建造者模式,又称生成器模式.是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂 ...
- PHP设计模式系列 - 建造者模式
什么是建造者模式 建造者模式主要是为了消除其它对象复杂的创建过程. 设计场景 有一个用户的UserInfo类,创建这个类,需要创建用户的姓名,年龄,金钱等信息,才能获得用户具体的信息结果. 创建一个U ...
随机推荐
- 16-1-27---JDBC复习(01)
JDBC数据库连接学习 用jdbc连接数据库 1.加载驱动 Class.forName(""); 用注册的方式会使内存中存在两个对象,而用上 ...
- 最大流-最小割 MAXFLOW-MINCUT ISAP
简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...
- XVII Open Cup named after E.V. Pankratiev. GP of SPb
A. Array Factory 将下标按前缀和排序,然后双指针,维护最大的右边界即可. #include<cstdio> #include<algorithm> using ...
- MD5加密的Java实现
在各种应用系统中,如果需要设置账户,那么就会涉及到储存用户账户信息的问题,为了保证所储存账户信息的安全,通常会采用MD5加密的方式来,进行储存.首先,简单得介绍一下,什么是MD5加密. MD5的全称是 ...
- liunux 修改hostname
最近鼓捣Oracle,记录些技巧 修改hostname # vim /ect/hosts # vim /etc/sysconfig/network 修改hostname # service netwo ...
- [Android] Shape背景制作半圆或半边框
实现原理使用layer-list对shape进行叠加显示. 直接上代码: <layer-list xmlns:android="http://schemas.android.com/a ...
- linux进程后台运行及输出重定向
本机环境为ubuntu 14.04 以ping www.baidu.com为例: 1.程序的前台运行 ping www.baidu.com 可以看到,屏幕上输出了baidu返回的结果 2.实现程序后台 ...
- 简单说说.Net中的弱引用
弱引用是什么? 要搞清楚什么是弱引用,我们需要先知道强引用是什么.强引用并不是什么深奥的概念,其实我们平时所使用的.Net引用就是强引用.例如: Cat kitty = new Cat(); 变量ki ...
- highchart 添加新的series
code: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" c ...
- windows下用虚拟机安装ubuntu
虚拟机软件推荐VMware Workstation,为了较好支持Win8,最好下载VMware Workstation10及以上新版本,对机器配置要求比较高,如果本身操作系统是WinXP或Win7的话 ...