《设计模式》一书中对于建造者模式是这样定义的:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。其实建造者模式就是用来创建复合对象,并把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。有点拗口,首先我们来看看它的UML图:
public class SoccerPlayer
{
List<string> skills = new List<string>();
public void AddSkill(string skill)
{
skills.Add(skill);
}
public void ShowSkills()
{
printf skills
}
}
public abstract class Builder
{
public abstract void BuildASkill();
public abstract void BuildBSkill();
public abstract SoccerPlayer GetSoccerPlayer();
}
public class ConcreteBuilder1 : Builder
{
private SoccerPlayer soccerPlayer = new SoccerPlayer();
public override void BuildASkill()
{
添加任意球技能
soccerPlayer.AddSkill("FreeKick");
}
public override void BuildBSkill()
{
添加角球技能
soccerPlayer.AddSkill("CornerKick");
}
public override SoccerPlayer GetSoccerPlayer()
{
return soccerPlayer;
}
}
public class ConcreteBuilder2 : Builder
{
private SoccerPlayer soccerPlayer = new SoccerPlayer();
public override void BuildASkill()
{
添加长传技能
soccerPlayer.AddSkill("LongPass");
}
public override void BuildBSkill()
{
添加短传技能
soccerPlayer.AddSkill("ShortPass");
}
public override SoccerPlayer GetSoccerPlayer()
{
return soccerPlayer;
}
}
public class Director
{
public void Construct(Builder builder)
{
builder.BuildASkill();
builder.BuildBSkill();
}
}
public class YouthCamp
{
public void Test()
{
Director coach = new Director();
ConcreteBuilder1 concreteBuilder1 = new ConcreteBuilder1();
ConcreteBuilder2 concreteBuilder2 = new ConcreteBuilder2();
coach.Construct(concreteBuilder1);
SoccerPlayer player1 = concreteBuilder1.GetSoccerPlayer();
player1.ShowSkills();
coach.Construct(concreteBuilder2);
SoccerPlayer player2 = concreteBuilder2.GetSoccerPlayer();
player2.ShowSkills();
}
}
总之,Builder模式就是把复杂对象的创建和部件的创建分别开来,对象的创建用Director类来表示,而部件的创建用Builder类来表示.
适用性:
1、需要生成的产品对象有复杂的内部结构。
2、需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、当复杂对象的创建应该独立于该对象的组成部分和装配方式时