意图:将复杂的对象构建与表示分离,只需要传入需要的建造工具,对于内部是如何创建成成品的,调用者无需关心
角色:1.产品类 2.抽象的Builder类 3.Builder的实现类 4.统一的组装过程类
情景:很多游戏在不同的节日都会有一些不同的变化,比如圣诞节的时候英雄联盟中王者峡谷地图的小兵会戴上帽子,河道草丛等会有积雪,中国春节的时候地图中又会变成大红色,和一些其他的中国风的装饰,这种其实可以用建造者模式来实现
产品类:这里就是英雄联盟的地图
public class MapBuilder {
private String sapperStyle;
private String mapColor;
public void setSapperStyle(String sapperStyle) {
this.sapperStyle = sapperStyle;
}
public void setMapColor(String mapColor) {
this.mapColor = mapColor;
}
public String getSapperStyle() {
return sapperStyle;
}
public String getMapColor() {
return mapColor;
}
}
规范产品组建类:地图种的小兵和地图样式
/**
* Created by LSX on 2018/5/8.
*/
public interface GameMapBuilder {
void sapperStyle();//小兵装饰
void mapColor();//地图颜色
}
具体组建实现的工具类:实现建造规范,创建自己的建造内容,这里创建中国风的地图
/**
* Created by LSX on 2018/5/8.
*/
public class ConcreteBuilder implements GameMapBuilder {
private MapBuilder mMapBuilder=new MapBuilder();
@Override
public void sapperStyle() {
mMapBuilder.setSapperStyle("中国风的小兵");
}
@Override
public void mapColor() {
mMapBuilder.setMapColor("红色地图");
}
}
统一建造者:其实可以省略,直接用builder来建造
public class DirectorBuilder {
GameMapBuilder mGameMapBuilder;
public DirectorBuilder(GameMapBuilder gameMapBuilder) {
this.mGameMapBuilder = gameMapBuilder;
}
public GameMapBuilder createBuilder() {
mGameMapBuilder.sapperStyle();
mGameMapBuilder.mapColor();
return mGameMapBuilder;
}
}
调用:调用者只需要传入需要的工具类即可,不用关心内部是如何创建的
/**
* 建造者
*/
private void builderSimple() {
DirectorBuilder director = new DirectorBuilder(new ConcreteBuilder());
director.createBuilder();
}
这样就可以实现同一个地图类,根据不同需求,去创建不同的地图样式了
优点:简化复杂对象构建,对象本身与创建过程解耦,无需知道具体的 ,内部实现细节,相同的创建过程可以创建不同的产品对象
缺点:可能会产生多余的建造者和和构建过程对象
