概述:
Builder模式 主要用于“构建一个复杂的对象”。把复杂对象的创建过程加以抽象,通过子类继承和重写方法,来得到具有复合属性的对象。
同时为了统一创建过程,把对象的创建操作统一封装到Director的方法中。
由于一个复杂对象的单个属性可能会发生变化(例如:制造汽车时使用的某一部件属于不同的厂家)但是整个复杂对象的构建过程却不会发生变化(例如:汽车的构建图纸已经固定,只需要把部件按照图纸装配好)
GOF:讲一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。即构建过程相同,但是子部件却不相同。
抽象工厂注重的是不同的工厂生产不同的产品,builder注重的是某个产品由不同的零件组成,产品的生产工程。
Director就是负责产品组装的,是控制生产过程的;而builder是负责产品部件生产的。这样就实现了“过程”和“部件”的解耦。
抽象工厂通过不同的构建过程生成不同的对象表示,而Builder模式通过相同的构建过程生成不同的表示。
适用性:
1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2.当构造过程必须允许被构造的对象有不同的表示时。
结构图(Struct):
协作(Collaborations):
生活中的例子:
import java.util.ArrayList;
//抽象的创建者类,主要给具体的创建者类创建模板,具体的创建者继承该类
//后,重写方法,用自己的方式创建风格不同的复杂对象的属性。但总体复杂
//对象的结构已经固定。
abstract class Builder{
public abstract void BuildDoor();
public abstract void BuildWall();
public abstract void BuildWindows();
public abstract void BuildHouseCeiling();
public abstract House GetHouse();
}
//具有复杂属性的对象。
class House{
private ArrayList <String>parts=new ArrayList<String>();
public void add(String str){
parts.add(str);
}
public void show()
{
for(String part:parts)
{
System.out.println(part+"\t");
}
System.out.println("\n");
}
}
//统一创建的过程,将创建过程统一。也可以有具体的流程
class Director{
public void construct(Builder builder){
builder.BuildDoor();
builder.BuildWall();
builder.BuildWindows();
builder.BuildHouseCeiling();
}
}
//具体的创建者类,负责创建具有不同表示的复杂对象
class ChineseBuilder extends Builder{
private House chineseHouse=new House();
public void BuildDoor() {
chineseHouse.add("ChineseDoor");
}
public void BuildWall() {
chineseHouse.add("ChineseWall");
}
public void BuildWindows() {
chineseHouse.add("ChineseWindows");
}
public void BuildHouseCeiling() {
chineseHouse.add("ChineseHouserCeiling");
}
public House GetHouse() {
return chineseHouse;
}
}
class EnglandBuilder extends Builder{
private House englandHouse=new House();
public void BuildDoor() {
englandHouse.add("EnglandDoor");
}
public void BuildWall() {
englandHouse.add("EnglandWall");
}
public void BuildWindows() {
englandHouse.add("EnglandWindows");
}
public void BuildHouseCeiling() {
englandHouse.add("EnglandHouserCeiling");
}
public House GetHouse() {
return englandHouse;
}
}
public class BuilderPattern {
public static void main(String[] args) {
Builder chineseBuilder=new ChineseBuilder();
Builder englandBuilder=new EnglandBuilder();
Director director=new Director();
director.construct(chineseBuilder);
House chineseHouse=chineseBuilder.GetHouse();
chineseHouse.show();
director.construct(englandBuilder);
House englandHouse=englandBuilder.GetHouse();
englandHouse.show();
}
}