1. 定义
建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。
2. 建造者模式通常包括下面几个角色:
(1)Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
(2)ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
(3)Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
(4)Product:要创建的复杂对象。
3. 建造者模式具体实现
下面以建造一辆车的过程来举例说明建造者模式的过程:
(1)定义要构建的具体对象Car
public class Car{
//轮子
private String wheel;
//车身
private String body;
//发动机
private String engine;
public String getWheel() {
return wheel;
}
public void setWheel(String wheel) {
this.wheel= wheel;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
}
(2)接下来我们定义一个建造汽车的标准接口
public interface IBuildCar {
public void buildWheel();
public void buildBody();
public void buildEngine();
public Car createCar();
}
一个接口定义好了。有建造各部位的方法,最后给个createCar方法给返回一个我们想要造的车。
现在,车的类和造车的标准我们都定义好了。那我们可以开始造车了,先造一个宝马吧。
(3)具体的建造宝马车实现类,实现了IBuildCar接口
public class BWMBuilder implements IBuildCar {
Car car;
public BWMBuilder(){
car= new Car();
}
@Override
public void buildWheel() {
car.setWheel("宝马的轮子");
}
@Override
public void buildBody() {
car.setBody("宝马的车身");
}
@Override
public void buildEngine() {
car.setEngine("宝马的发动机");
}
@Override
public Car createCar() {
return car;
}
}
(4)这里就是建造者模式的精髓了director,它按照按照需要的规则或顺序将最终实例的各部分进行组装
public class Director {
public Car createCarByDirecotr(IBuildCar bc){
bc.buildBody();
bc.buildEngine();
bc.buildWheel();
return bc.createCar();
}
}
这个director的重点在于createCarByDirecotr的参数是我们的造车标准的接口。这样一来,只要是实现了我们的这个接口的类,就都可以作为参数,那我们不仅可以造宝马,还可以造奔驰,法拉利,只要我们把我们想造的车对应的类写好就行了。
(5)测试
public class BuilderTest {
public static void main(String[] args){
Director director = new Director();
Car car = director.createCarByDirecotr(new BWMBuilder());
System.out.println(car.getWheel());
System.out.println(car.getBody());
System.out.println(car.getEngine());
}
}
输出结果为:
宝马的轮子
宝马的车身
宝马的发动机
4. 优点
(1)解耦,将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。
(2)易于精确控制对象的创建 ,将复杂产品的创建步骤分解在不同的方法中,使得创建过程可控
(3)易于拓展 ,增加新的具体建造者无需修改原有类库的代码,用户使用不同的具体建造者即可得到不同的产品对象。
5. 使用场景
需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;
如果产品之间的差异性很大,则不适合使用建造者模式。