我们在建造的过程是基本稳定的,不需要大变动,只要是人这个类不管是胖瘦,都得有头身手脚。但是具体的一些细节是不同的,有高矮胖瘦、长腿长胳膊,对于用户来说他最终要的是结果,你只管建就可以了,在这样的需求下我们要将这个复杂对象的构建和其表示分离开来,使得同样的构建过程能创造更多的表示方法,满足不同用户的需求。
1、定义
建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
2、使用频率
中低
3、原型模式应用
在软件系统中,有时候面临一个复杂对象的创建工作,该对象通常由各个部分子对象用一定的算法构成,或者按一定的步骤组合而成;这些算法和步骤是稳定的,而构成这个对象的子对象却经常由于需求的变化而不断变化。
生活中的例子,要组装一台电脑,它的组装过程基本是不变的,都可以由主板、CPU、内存等按照某个稳定方式组合而成。然而主板、CPU、内存等零件本身都是可能多变的。将内存等这种易变的零件与电脑的其他部件分离,实现解耦合,则可以轻松实现电脑不断升级。
4、建造者模式结构图
5、建造者模式参与者:
1.Builder:为创建一个Product对象的各个部件指定抽象接口;
2.ConcreteBuilder 具体实现如何画出小人的头身手脚个部分。具体建造者;实现Builder接口;构建和装配各个配件。
3.Director:指挥者,根据用户的需求构建小人对象。构造一个使用Builder接口的对象;
4.Product 具体的产品角色;包含定义组成部件的类,包括将这些部件装配成最终产品的接口
在建造者模式中,Director规定了创建一个对象所需要的步骤和次序,Builder则提供了一些列完成这些步骤的方法ConcreteBuilder给出了这些方法的具体实现,是对象的直接创建者。
建造者模式基本代码:
Product类-产品类-多部件组成。
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类-抽象的建造者类,产品有PartA和PartB组成,并且生命一个得到产品建造结果的GetResult.
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-具体建造者类
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-具体建造者类
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-指挥类
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();
}
}
}
客户端代码 ,客户完全不知建造的过程
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();
}
}
}
总结:
建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。实现最快捷的组装,提出需求能很快的做出对应产品。建造者模式的本质是使组装过程在黑箱中操作,我们不用去关心每个组件是如何组装的,只需要做好各部分的工作就能收获产品。