定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式由4个角色构成:
Director(指挥者类):指挥者负责安排复杂对象的建造次序,指挥者和建造者之间存在关联关系,调用建造者建造组件的方法完成建造任务并返回建造完成的对象,这里我们需要先指定使用哪个建造者。一般情况下用户只需要和指挥者类交互即可。
Builder(抽象建造者):为创建一个产品对象的各个部件指定抽象接口,在该接口或者类中一般提供两种方法,第一种就是各个组件的创建方法,另一类方法是对象返回方法,用于将构建完成的对象返回。
ConcreteBuilder(具体建造者):具体建造者实现或者继承抽象建造者,实现各个组件的创建方法和对象返回方法。
Product(产品): 被构建的复杂对象,包含多个组件。
举例
红绿灯的交替变化
//环境类
public class Context
{
private State state;//设置默认状态
public Context()
{
state = new ConcreteStateA();
}//设置(切换)状态
public void SetState(State state)
{
this.state = state;
}//供客户使用的方法
public void Request()
{
state.Handle(this);
}
}
//抽象状态类
public abstract class State
{
//不同状态下都要用的方法(实现不同)
public abstract void Handle(Context context);
}
//具体状态类
public class ConcreteStateA : State
{
public override void Handle(Context context)
{
Console.WriteLine("绿灯");//直接切换状态
context.SetState(new ConcreteStateB());
}
}public class ConcreteStateB : State
{
public override void Handle(Context context)
{
Console.WriteLine("黄灯");context.SetState(new ConcreteStateC());
}
}public class ConcreteStateC : State
{
public override void Handle(Context context)
{
Console.WriteLine("红灯");context.SetState(new ConcreteStateA());
}
}
//客户类
class Program
{
static void Main(string[] args)
{
Context context = new Context();//每次调用状态都在改变
context.Request();
context.Request();
context.Request();
context.Request();
}
}
总结:环境类中创建一个状态对象,构造函数中设置默认状态,还有切换状态的set方法,同时提供客户使用的方法,在该方法中调用当前状态的行为,具体状态类中若传入环境类对象,则可以使用环境类中切换状态的方法来改变当前状态。