对象说除了单例模式以外这个设计模式最简单……小100行……哪里简单
学习建造者模式再次印证了学习OOP最好的方法是学设计模式
运用场景是讲一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。即:讲一个产品的内部表象和产品的生成过程分割开来,从而可以使得一个建造过程生成具有不同内部表象的产品对象。如果使用建造者模式,那么用户就可以只需指定需要建造的类型就可以得到他们,具体的建造过程和细节不需要知道
具体几个类:
Product 具体产品
Builder为创建一个Product对象的各个部分指定的抽象接口
ConcreteBuilder是具体的建造者,实现Builder接口,构建和装配各个部件
Director 构建一个使用builder接口的对象
主要用在创建一些复杂的对象,这些对象内部构建之间的建造顺序是稳定的,但是对象内部的构建通常面临着复杂的变化
好处是建造代码与表示代码分离,隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了
举个例子
Product产品类
class Student
{
IList<string> parts = new List<string>();
public void Add(string part)
{
parts.Add(part);//添加属性
}
public void Show()
{
Console.WriteLine("学生 创建---");
foreach(string part in parts)
{
Console.WriteLine(part);
}
}
}
Builder类 抽象建造者类,确定产品由两个部件 Score Personilty组成(好像拼错了)
并声明一个得到结果的方法GetStudent
abstract class Builder
{
public abstract void BuildPartScore();
public abstract void BuildPartPersonilty();
public abstract Student GetStudent();
}
ConcreteBuilder 具体建造类
class ConcreteBuilder1:Builder
{
private Student student = new Student();
public override void BuildPartScore()
{
student.Add("Score A");
}
public override void BuildPartPersonilty()
{
student.Add("Open");
}
public override Student GetStudent()
{
return student;
}
}
class ConcreteBuilder2:Builder
{
private Student student = new Student();
public override void BuildPartScore()
{
student.Add("Score F");
}
public override void BuildPartPersonilty()
{
student.Add("Closed");
}
public override Student GetStudent()
{
return student;
}
}
Director指挥类 学校
class School
{
public void Construct(Builder builder)
{
builder.BuildPartScore();
builder.BuildPartPersonilty();
}
}
客户端
static void Main(string[] args)
{
School school = new School();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
school.Construct(b1);
Student s1 = b1.GetStudent();
s1.Show();
school.Construct(b2);
Student s2 = b2.GetStudent();
s2.Show();
Console.Read();
}
结果:
学生 创建---
Score A
Open
学生 创建---
Score F
Closed