目录
简介
四个角色
应用场景
实现步骤
和工厂模式的区别
简介
建造者模式也叫生成器模式,是一种对象构建模式;它可以把复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象;建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容,就可以构建它们,用户不需要知道内部的具体构建细节;
四个角色
1. Product(产品角色):一个具体的产品对象
2. Builder(抽象建造者):创建一个 Product 对象的各个部件指定的接口/抽象类
3. ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件
4. Director(指挥者):构建一个实用 Builder 接口的对象;它主要是用于创建一个复杂的对象,它主要有两个作用:隔离了客户和对象的生产过程;负责控制产品对象的生产过程
应用场景
- 相同的方法,不同的执行顺序,产生不同的结果
- 多个部件或零件,都可以装配到对象中,但是产生的结果不同
- 产品类非常复杂,或者产品类中不同的调用顺序产生不同的结果
- 初始化一个对象特别复杂,参数多,而且很多参数都具有默认值
实现步骤
这里以建造房屋为例,建造房屋分为 3 个步骤:打地基,建墙,封顶
1. 新建 House.class,即产品角色
/**
* 房子类
*/
public class House {
// 地基
private String foundation;
// 墙
private String wall;
// 屋顶
private String roof;
public String getFoundation() {
return foundation;
}
public void setFoundation(String foundation) {
this.foundation = foundation;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getRoof() {
return roof;
}
public void setRoof(String roof) {
this.roof = roof;
}
}
2. 新建 HouseBuilder.class,这是一个抽象类,定义了建造房屋的基本流程和规范
/**
* 房屋建造指挥者, 指定建房流程
*/
public abstract class HouseBuilder {
protected House house = new House();
// 打地基
public abstract void buildFoundation();
// 建墙
public abstract void buildWall();
// 封顶
public abstract void buildRoof();
// 建房流程
public House buildHouse() {
return house;
}
}
3. 新建 VillaHouseBuilder.class,继承 HouseBuilder.class,实现具体的别墅建造过程
/**
* 别墅类-实际房子建造
*/
public class VillaHouse extends HouseBuilder {
@Override
public void buildFoundation() {
house.setFoundation("别墅-地基30米");
}
@Override
public void buildWall() {
house.setWall("别墅-砖墙");
}
@Override
public void buildRoof() {
house.setRoof("别墅-瓦顶");
}
}
4. 新建 HouseDirector.class,指挥者,负责具体的创建 house 的过程
/**
* 指挥者, 控制房子创建流程
*/
public class HouseDirector {
private HouseBuilder houseBuilder;
public HouseBuilder getHouseBuilder() {
return houseBuilder;
}
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
// 具体建造过程
public House constractVillaHouse() {
houseBuilder.buildFoundation();
houseBuilder.buildWall();
houseBuilder.buildRoof();
return houseBuilder.buildHouse();
}
}
5. 测试一下对象的创建
public static void main(String[] args) {
VillaHouse villaHouse = new VillaHouse();
HouseDirector houseDirector = new HouseDirector();
houseDirector.setHouseBuilder(villaHouse);
House house = houseDirector.constractVillaHouse();
System.out.println("别墅建造信息: ");
System.out.println(house.getFoundation());
System.out.println(house.getWall());
System.out.println(house.getRoof());
}
其实观察上面的代码,我们发现,建造者模式主要是把对象的创建过程分离了,创建和表示分离;如果我们需要创建不同的对象,只需再创建建造者和指挥者即可;如果建造的流程有变化,我们也只需要调整指挥者即可;这在一定程度上带来了代码的臃肿,但达到了解耦的效果,所以这种模式适合创建复杂的对象
和工厂模式的区别
- 建造者模式更加注重方法的调用顺序,工厂模式注重创建对象
- 创建对象的力度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,而工厂模式创建的对象都一样
- 关注点不一样,工厂模式只需要把对象创建出来就可以了,而建造者模式不仅要创建出对象,还要关注对象由哪些部件组成
- 建造者模式根据建造过程中的顺序不一样,可以创建各种不同的对象