1. 概念
建造者模式(Builder Pattern) 又名生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
建造者模式就是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
2. 适用场景
需要生成的产品对象内部结构复杂;
需要生成的产品对象属性相互依赖;
需要生成的产品对象使用其他不易得到对象;
3. 代码示例分析
故事情节是这样的:我发现我儿子(8岁)现在对游戏很迷恋(当然了我会限制他的时间),现在也是正值寒假期间嘛,观察了一下,他最近经常看《我的世界》的攻略视频。其中有个场景是建造地形,地形也是比较复杂的,分为墙、堡垒、矿井等。
好了废话不多说,直接上代码
- 待构建的地形类-Terrain:
// 地形
public class Terrain {
Wall w;
Fort f;
Mine m;
}
// 城墙
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 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;
}
}
// 矿井
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;
}
}
- 抽象地形建造-TerrainBuilder:
public interface TerrainBuilder {
TerrainBuilder buildWall(); // 返回值这里用了点小技巧【醒目】,到场景类就可以看到
TerrainBuilder buildFort();
TerrainBuilder buildMine();
Terrain build();
}
- 具体的构建者 - ComplexTerrainBuilder:
public class ComplexTerrainBuilder implements TerrainBuilder {
Terrain terrain = new Terrain(); // 待构建的复杂对象
@Override
public TerrainBuilder buildWall() {
terrain.w = new Wall(10, 10, 50, 50);
return this;
}
@Override
public TerrainBuilder buildFort() {
terrain.f = new Fort(10, 10, 50, 50);
return this;
}
@Override
public TerrainBuilder buildMine() {
terrain.m = new Mine(10, 10, 50, 50);
return this;
}
@Override
public Terrain build() {
return terrain;
}
}
- 场景类 - Director:
public class Director {
TerrainBuilder builder = new ComplexTerrainBuilder();
Terrain t = builder.buildFort().buildMine().buildWall().build(); // 链式
}
4. 总结
建造模式分为两个很重要的部分:
Builder接口:定义了如何构建各个部件。
Director角色:负责整体的构建算法,通常是分步骤的构建产品。建造模式的核心:
在于分离构建算法和具体构造的实现,从而使得构建算法可重用,具体的构造实现可以方便扩展和切换,从而可以灵活地构造出不同的产品对象。建造模式 VS 抽象工厂:
工厂模式实现:获取对象;
建造模式实现:创建对象;
抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品。
————————————————————
坐标帝都,白天上班族,晚上是知识的分享者
如果读完觉得有收获的话,欢迎点赞加关注