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)的更多相关文章

  1. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

  2. 【设计模式】建造者模式 Builder Pattern

    前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...

  3. 二十四种设计模式:建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...

  4. 设计模式之建造者模式——Builder

    一.概述 Builder模式,中文名为建造者模式,又名生成器模式.构建者模式等,是创建型设计模式之一.用于将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 1.适用性: 对象 ...

  5. 设计模式-05建造者模式(Builder Pattern)

    1.模式动机 比如我们要组装一台电脑,都知道电脑是由 CPU.主板.内存.硬盘.显卡.机箱.显示器.键盘和鼠标组成,其中非常重要的一点就是这些硬件都是可以灵活选择,但是组装步骤都是大同小异(可以组一个 ...

  6. 设计模式之建造者模式(Builder)

    建造者模式原理:建造模式主要是用于产生对象的各个组成部分,而抽象工厂模式则用于产生一系列对象,建造者模式而且要求这些对象的组成部分有序. 代码如下: #include <iostream> ...

  7. 设计模式之建造者模式Builder(创建型)

    1. 概述 在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定 ...

  8. Python 设计模式之建造者模式 Builder Pattern

    #引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...

  9. 【UE4 设计模式】建造者模式 Builder Pattern

    概述 描述 建造者模式,又称生成器模式.是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂 ...

  10. PHP设计模式系列 - 建造者模式

    什么是建造者模式 建造者模式主要是为了消除其它对象复杂的创建过程. 设计场景 有一个用户的UserInfo类,创建这个类,需要创建用户的姓名,年龄,金钱等信息,才能获得用户具体的信息结果. 创建一个U ...

随机推荐

  1. 【填坑】bzoj3224 splay裸题

    人生第一道splay不出所料是一道裸题,一道水题,一道2k代码都不到的题 #include <cstdio> ,n,p,q; ],c[][],size[],sp[]; void rot(i ...

  2. Shader实例:扭曲,漩涡

    效果: 案例:新仙剑,王者之剑. 在切换场景的时候,就会有这样的全屏扭曲效果. 思路: 1.用GrabPass抓屏到一张纹理中. 2.进行扭曲,绘制到UGUI的Image上. 准备: 去官网下载Uni ...

  3. MAC帧和IP包的分析

    ping了12次岭南师范学院官网后退出   抓到的包如下   各个名词解释

  4. 大BOSS随时都会到来

    郑昀(微博:http://weibo.com/yunzheng) 去年在上市前后,我不止一次跟大家说过如下内容: 我们这帮兄弟第一精通业务,第二有丰富的战斗经验和规范,你们都是中流砥柱,都要带兵打仗. ...

  5. debian下Apache和tomcat整合(使用apt工具)

    最近部署web系统,需要使用tomcat处理和Apache整合使用,tomcat处理JSP,Apache处理静态资源.开始不知道怎么操作,在网上查阅资料走了很多弯路.完成时候,发现其实很简单,现将配置 ...

  6. 运行错误:error while loading shared libraries: xxx.so.0:cannot open shared object file: No such file or

    链接时可以通过-L和-l来指定自己的库,因此链接可以通过,但是运行时,系统仍无法找到指定的库,需要简单配置一下. 解决方法: 可以直接在将自己的库所在路径添加到/etc/ld.so.conf文件中.但 ...

  7. python基础之day2

    python基本数据类型 1.数字 int(整型)      在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647  在64位系统 ...

  8. Django models知识小点

    django 为使用一种新的方式,即关系对象映射(ORM) 一,创建表 1,基本结构 注意: 1,创建标的时候,如果我们不给表加自增列,生成表的时候会默认给我们生成一列为ID的自增列,当然我们也可以自 ...

  9. PHP DOS漏洞的新利用:CVE-2015-4024 Reviewed

    1.     背景介绍 今天我们想从2015.04.03的一个PHP远程dos漏洞(CVE-2015-4024)说起.技术细节见如下链接,https://bugs.php.net/bug.php?id ...

  10. 有了lisk,为什么我们还要做一个Asch?

    0 前言 首先要声明一点,我们和我们的一些朋友都是lisk的投资人和支持者,我们也相信lisk会成功. 事实上,lisk已经成功了一半,目前在区块链领域融资金额排行第二,仅次于以太坊. 那为什么我们还 ...