意图:
将复杂的对象构建与表示分离,只需要传入需要的建造工具,对于内部是如何创建成成品的,调用者无需关心
角色: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()
;
}
这样就可以实现同一个地图类,根据不同需求,去创建不同的地图样式了
优点:简化复杂对象构建,对象本身与创建过程解耦,无需知道具体的 ,内部实现细节,相同的创建过程可以创建不同的产品对象
缺点:可能会产生多余的建造者和和构建过程对象