定义
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
从定义的表示我们可以看出,建造者模式本质上就是一个建造工厂,它可以建造各种不同的对象,但是我们看不到其具体流程,即构建与表示分离。
UML图
从图中可知,建造者模式由4部分组成:
- 指挥者Director
- 建造者Builder
- 具体建造者ConcreteBuiler
- 产品Product
1.指挥者Director,其作用是指挥产品建造的步骤和流程,即定义使用建造者Builder中的方法来生成实例的方法。
2.建造者Builder,通常是一个接口或抽象类,其作用是定义出建造产品所需要的所有方法。
3.具体建造者ConcreteBuiler,继承或实现建造者Builder,其作用是实现建造产品所需要的所有方法,并且定义获取最终产品的方法。
下面通过代码来分析建造者模式。
假设你要去电脑城组装一台电脑,定义:电脑商铺老板为Director,电脑安装方案为Builder,装机人员为ConcreteBuilder,安装好的电脑为Product。
1.创建Builder
//抽象类Builder
public abstract class Builder {
//组装电脑的抽象方法(3步)
public abstract void BuildCPU();
public abstract void BuildMainboard();
public abstract void BuildHD();
//定义获取最终产品的抽象方法
public abstract Computer GetComputer();
}
2.创建Director
public class Director{
//指挥装机人员组装电脑
public void Construct(Builder builder){
builder.BuildCPU();
builder.BuildMainboard();
builder.BuildHD();
}
}
3.创建ConcreteBuilder
public class ConcreteBuilder extend Builder{
Computer computer = new Computer();
//组装产品
@Override
public void BuildCPU(){
computer.Add("组装CPU")
}
@Override
public void BuildMainboard(){
computer.Add("组装主板")
}
@Override
public void BuildHD(){
computer.Add("组装主板")
}
//返回组装好的电脑
@Override
public Computer GetComputer(){
return computer
}
}
4.定义Product
public class Computer{
//电脑零件的集合
private List<String> parts = new ArrayList<String>();
//用于将组件组装到电脑里
public void Add(String part){
parts.add(part);
}
//显示建造信息
public void Show(){
for (int i = 0;i<parts.size();i++){
System.out.println("组件" + parts.get(i) + "装好了");
}
System.out.println("电脑组装完成,请验收");
}
}
5.测试
public class Builder Pattern{
public static void main(String[] args){
//创建指挥者
Director director = new Director();
//创建建造者
Builder builder = new ConcreteBuilder();
//指挥者指挥传入过来的建造者建造产品
director.Construct(builder);
//获取最终产品
Computer computer = builder.GetComputer();
//显示建造过程
computer.Show();
}
}
通过代码可知,建造者模式的核心为建造者Builder、具体建造者ConcreteBuilder、指挥者Director,指挥者通过指挥传入过来的Builder执行建造方法,建造完成后,通过builder获取最终产品。
总结:
1.优点
- 易于解耦,将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。
- 易于精确控制对象的创建,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
- 易于拓展,增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则”
— by:Carson带你学安卓*
2.缺点
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
— by:Carson带你学安卓
3.使用场景
- 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
建造者模式与工厂模式的不同:
建造者模式最主要的功能是基本方法的调用顺序安排,这些基本方法已经实现了,
顺序不同产生的对象也不同。
工厂模式则重点是创建,创建零件是它的主要职责,而不关心组装顺序。