构造者模式使用多个简单的对象一步一步构建成一个复杂的对象,属于创建型模式,它提供了一种创建对象的最佳方式
Builder 模式基于:一个对象可能有不同的组成部分,这些组成部分的不同创建对象有不同的表示,但是各个部分之间装配的方式是一致的(比如单车的装配,车轮、链条、车身、脚踏板)。
基于此,构建的过程是一样的,所以可以统一使用一个抽象接口,不同的组成部分可以由派生类来实现
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
适用于以下情况:
解析:
Builder 模式的实现,基于以下面向对象设计原则:
using System;
namespace ConsoleApp2
{
class Class7
{
public static void Main(string[] args)
{
PersonDirector dir = new PersonDirector(new ThinPersonBuilder());
Person person = dir.BuildPerson();
Console.WriteLine(person.Head);
Console.WriteLine(person.Body);
Console.WriteLine(person.Arm);
Console.WriteLine(person.Leg);
Console.ReadLine();
}
}
// 要建造的产品
public class Person
{
public string Head { get; set; }
public string Body { get; set; }
public string Arm { get; set; }
public string Leg { get; set; }
}
// 定义创建者接口,实现者必须实现该接口中定义的所有抽象方法,防止实现者疏忽而遗漏某个部件的创建
public abstract class Builder
{
protected Person Person { get; set; }
public Builder()
{
Person = new Person();
}
// 建造头
public abstract void BuildHead();
// 建造身体
public abstract void BuildBody();
// 建造胳膊
public abstract void BuildArm();
// 建造腿
public abstract void BuildLeg();
// 返回生成好的对象,这是一个具体方法,每个子类都可以使用它来返回一个已经创建成功的对象
public Person GetPerson()
{
return Person;
}
}
// 建造者的具体实现,这里是要建造出一个瘦子
public class ThinPersonBuilder : Builder
{
public override void BuildHead()
{
Person.Head = "瘦子的脑袋";
}
public override void BuildBody()
{
Person.Body = "瘦子的身体";
}
public override void BuildArm()
{
Person.Arm = "瘦子的胳膊";
}
public override void BuildLeg()
{
Person.Leg = "瘦子的腿";
}
}
// 建造者的具体实现,这里是要建造出一个胖子
public class FatPersonBuilder : Builder
{
public override void BuildHead()
{
Person.Head = "胖子的脑袋";
}
public override void BuildBody()
{
Person.Body = "胖子的身体";
}
public override void BuildArm()
{
Person.Head = "胖子的胳膊";
}
public override void BuildLeg()
{
Person.Head = "胖子的腿";
}
}
// 建造者模式中的指挥者
public class PersonDirector
{
Builder builder;
public PersonDirector(Builder personBuilder)
{
builder = personBuilder;
}
// 指挥创建一个人的过程,并返回创建成功的产品
public Person BuildPerson()
{
builder.BuildHead();
builder.BuildBody();
builder.BuildArm();
builder.BuildLeg();
return builder.GetPerson();
}
}
}