建造者模式(Builder Pattern)又称生成器模式:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
三个角色:建造者、具体的建造者、被建造对象、使用者(严格来说不算)
- 建造者角色:定义生成实例所需要的所有方法
- 具体的建造者角色:实现生成实例所需要的所有方法,并且定义获取最终生成实例的方法
- 被建造对象:被构建的对象
- 使用者:使用建造者模式。
注意:定义中“将一个复杂的构建过程与其表示相分离”,各个不同的建造者分别负责实现构建过程中所用到的所有构建步骤。
第一步、创建构建者接口或者抽象类
/**
* 建造者抽象类也可以是接口
*/
public interface Builder {
Builder buildWall();
Builder buildFort();
Builder buildMine();
Terrain build();
}
第二部、创建具体的构建者和被构建对象
/**
* 地形类
*/
public class Terrain {
Wall w;
Mine m;
Fort f;
}
/**
* 墙
*/
class Wall {
int x, y, w, h;
public Wall(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}
}
/**
* 矿
*/
class Mine {
int x, y, w, h;
public Mine(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}
}
/**
* 要塞
*/
class Fort {
int x, y, w, h;
public Fort(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}
}
package 创建型.builder;
/**
* 复杂地形构建(具体建造者)
*/
public class ComplexTerrainBuilder implements Builder {
Terrain terrain = new Terrain();
/**
* 构建墙
*/
@Override
public Builder buildWall() {
terrain.w = new Wall(10, 10, 50, 50);
return this;
}
/**
*构建矿
* @return
*/
@Override
public Builder buildMine() {
terrain.m = new Mine(10, 10, 50, 50);
return this;
}
/**
*构建要塞
* @return
*/
@Override
public Builder buildFort() {
terrain.f = new Fort(10, 10, 50, 50);
return this;
}
/**
* 返回被构建对象
* @return
*/
@Override
public Terrain build() {
return terrain;
}
}
第三步、具体的构建使用如下
public class Client {
public static void main(String[] args) {
Builder builder = new ComplexTerrainBuilder();
//可以自定义构建地形
Terrain t1 = builder.buildWall().buildMine().build(); //构建地形1(包含墙、矿)
Terrain t2 = builder.buildWall().buildFort().build(); //构建地形2(包含墙、要塞)
Terrain t3 = builder.buildFort().buildMine().buildWall().build(); //构建地形2(包含墙、矿、要塞)
}
}