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 ...
 
随机推荐
- 疑难问题解决备忘录(3)——ubuntu12.04配置vsftp本地用户登录
			
vsftpd.conf相关项设置 local_enabled = YES write_enable=YES pam_service_name=ftp pam_service_name按默认的vsftp ...
 - Problem of saving images in WPF (RenderTargetBitmap)zz
			
To save a visual to an image file need to use RenderTargetBitmap, detail is reference to Save and ...
 - cassandra写数据CommitLog
			
cassandra 两种方式: Cassandra-ArchitectureCommitLog Cassandra持久化-Durability 一种是配置commitlog_sync为periodic ...
 - linux菜鸟日记(4)
			
使用一个简单的for循环和if判断语句实现某个网段内所有ping所有客户机的shell程序: ..} do >&; then echo " ${i}通" else e ...
 - compass reset和layout [Sass和compass学习笔记]
			
reset 可以重置浏览器的的html的默认样式,因为各个浏览器对有些元素解析差别很大 通过重置样式可以让样式的浏览器兼容 更简单 使用方法简单 @import "compass/reset ...
 - 整理 PHPstorm实用个人配置,修改调整个性化快捷键,修改使用phpstorm创建的模板的默认注释:
			
对你有助请点赞,请顶------送人玫瑰,手留余香! 1:58 2016/3/12 整理PHPstorm实用个人配置,修改调整个性化快捷键,修改使用phpstorm创建的模板的默认注释: PHPsto ...
 - Asp.Net Mvc + ComBoost.Mvc快速开发
			
ComBoost项目地址 http://comboost.wodsoft.com https://github.com/Kation/ComBoost/tree/develop 准备工作 首先,在Vi ...
 - Android -- 软键盘
			
1. 应用启动后,自动打开软键盘 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD ...
 - django _meta方法
			
models.Book._meta.'concrete_model': <class 'books.models.Book'> models.Book._meta.'related_fke ...
 - 使用html5 地理位置技术 和 百度地图api查询当前位置
			
使用了 zepto 和 requirejs define(['zepto'],function($){ var geolocation = { init:function(config,onSuc ...