1、定义
也叫生成器模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
2、作用
在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。
3、解决的问题
-
方便用户创建复杂的对象(不需要知道实现过程)
-
代码复用性 & 封装性(将对象构建过程和细节进行封装 & 复用)
4、模式原理
(1)、UML类图
-
指挥者(Director)直接和客户(Client)进行需求沟通;
-
沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder);
-
将各个部件的建造请求委派到具体的建造者(ConcreteBuilder);
-
各个具体建造者负责进行产品部件的构建;
-
最终构建成具体产品(Product)。
(2)、实例
a、实例概况
背景:小成希望去汽配城买一辆车
过程:汽配城老板(Diretor)和小成(Client)进行需求沟通,了解需求后,老板将小成需要的划见分为各个部件(Builder)的建造请求(engine发动机、chassis底盘、body车身、electrical电气)
指挥组装人员(ConcreteBuilder)去构建组件;
将组件组装起来成小成需要的电脑(Product)
b、创建步骤
(1)、定义组装的过程(Builder)
public abstract class Builder {
//第一步安装发动机
//声明为抽象方法,具体由子类实现
public abstract void BuilderEngine();
//第二步安装底盘
//声明为抽象方法,具体由子类实现
public abstract void BuilderChassis();
//第三步安装车身
//声明为抽象方法,具体由子类实现
public abstract void BuilderBody();
//第四步安装电气设备
//声明为抽象方法,具体由子类实现
public abstract void BuilderElectrical();
//返回产品的方法,获得组装好的汽车
public abstract Car getCar();
}
(2)、老板委派任务给装配人员(Director)
public class Director {
//指挥人员装配汽车
public void Construct(Builder builder) {
builder.BuilderEngine();
builder.BuilderChassis();
builder.BuilderBody();
}
}
(3)、创建具体的建造者(ConcreteBuilder):装配人员
public class ConcreteBuilder extends Builder{
//创造产品实例
Car car = new Car();
//组装产品
@Override
public void BuilderEngine() {
// TODO Auto-generated method stub
car.Add("组装发动机");
}
@Override
public void BuilderChassis() {
// TODO Auto-generated method stub
car.Add("组装底盘");
}
@Override
public void BuilderBody() {
// TODO Auto-generated method stub
car.Add("组装车身");
}
@Override
public void BuilderElectrical() {
// TODO Auto-generated method stub
car.Add("组装电气设备");
}
//返回组装成功的汽车
@Override
public Car getCar() {
return car;
}
}
(4)、定义具体产品类(Product):汽车
public class Car {
// 汽车组件的集合
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 Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Director director = new Director();
Builder builder = new ConcreteBuilder();
//装汽车
director.Construct(builder);
//组装完成
Car car = builder.getCar();
//展示组装完成的汽车
car.Show();
}
}
5、优点
-
易于解耦
将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。
-
易于精确控制对象的创建
将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
-
易于拓展
增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。
6、缺点
-
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
-
如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
7、应用场景
-
需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
-
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。