builder模式主要应对复杂对象的各个部分频发变化。缺点在于难以应对构建算法的变化。在builder模式中,要注意不同语言中构造器调用虚函数的差别。
一、意图
将一个复杂对象的构建与它的表示分离(抽象),使得同样的构建过程(稳定)可以创建不同的表示(变化)。(GOF)
二、动机
在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法(稳定)构成,由于需求的变化,这个复杂的对象的各个部分面临着剧烈变化,但是将它们组合到一起的算法却相对稳定。
三、适用性
-
当创建复杂对象的算法(过程)应该独立于该对象的组成部分(成员函数、成员变量等)时以及它们的装配方式(调用)时。
-
当构造过程必须允许被构造的对象有不同的表示(组成部分不同)时。
四、效果
- 可以改变一个产品的内部表示(修改一个对象内部的变量或者方法)。
- 将构造代码和表示代码分开。
- 可以对构造过程进行更精细的控制。
五、结构
六、参与者、
-
Builder:
-为创建一个Product对象的各个部件指定抽象接口。
-
ConcreteBuilder:
-实现Builder的接口以构造和装配该产品的各个部件。
-定义并明确它所创建的表示。
-提供一个检索产品的接口。
- Dirctor:
-构造一个使用builder接口的对象。
- Product:
-表示被构造的复杂对象。ConcreteBuilder创建该对象的内部表示并定义它的装配过程。
-包含定义组成部件的类。包括将这些部件装配成最终产品的接口。
七、代码示例
我们举一个盖房子的例子,假设盖一个房子需要地板(floor)、墙(wall)、窗户(window)和屋顶(roof)。
using System;
namespace Builder
{
class Client
{
static void Main(string[] args)
{
House house;//Product
Dirctor dirctor = new Dirctor();
GoldHouse goldHouse = new GoldHouse();//这一步也可以写道Director里面去
dirctor.Constrcut(goldHouse);
house = goldHouse.GetHouse();
house.Show();
Console.ReadLine();
}
}
}
Builder抽象类,定义构造House(Product)的接口和“GetResult”。
using System;
using System.Collections.Generic;
using System.Text;
namespace Builder
{
abstract class HouseBuilder
{
abstract public House BuildHouse();
abstract public void BuildRoof();
abstract public void BuildWindow();
abstract public void BuildFloor();
abstract public void BuildWall();
abstract public House GetHouse();
}
}
⬇⬇⬇⬇ 定义House(Product)。⬇⬇⬇⬇
using System;
using System.Collections.Generic;
using System.Text;
namespace Builder
{
class House
{
public string RoorMateria = null;
public string WindowMateria = null;
public string WallMateria = null;
public string FloorMateria = null;
public void Show()
{
Console.WriteLine(RoorMateria);
Console.WriteLine(WindowMateria);
Console.WriteLine(WallMateria);
Console.WriteLine(FloorMateria);
}
}
}
GoldHouse(ConcreteBuilder),实现接口,构造house,然后返回house实例。
using System;
using System.Collections.Generic;
using System.Text;
namespace Builder
{
/// <summary>
/// ConcreteBuilder
/// </summary>
class GoldHouse : HouseBuilder
{
private House newHouse;
public override House BuildHouse()
{
newHouse = new House();
return newHouse;
}
public override void BuildFloor()
{
newHouse.FloorMateria = "金地板";
}
public override void BuildRoof()
{
newHouse.RoorMateria = "金屋顶";
}
public override void BuildWall()
{
newHouse.WallMateria = "金墙";
}
public override void BuildWindow()
{
newHouse.WindowMateria = "金窗户";
}
public override House GetHouse()
{
return newHouse;
}
}
}
Director,以“同样的构建过程”构建house。
using System;
using System.Collections.Generic;
using System.Text;
namespace Builder
{
class Dirctor
{
public void Constrcut(HouseBuilder houseBuilder)
{
houseBuilder.BuildHouse();
houseBuilder.BuildFloor();
houseBuilder.BuildRoof();
houseBuilder.BuildWall();
houseBuilder.BuildWindow();
}
}
}
总结:builder模式,适用于创建一个对象的流程是固定的,但是每一步的内容会有变化,然后我们抽象出一个基类(Builder)包含创建对象的过程(part1,part2...和getResult返回构建的对象),ContreteBuilder具体实现,Dirctor就是创建对象具体过程,第一步执行哪个,第二部执行哪个...,具体实现大同小异。
这是最开始的版本,有Director。如果只有一个Concretebuilder,可以省略Director、和Builder。
学习笔记,仅供参考。走火入魔,概不负责。如有错误,谢谢指出。(^_^)