今天,我们来谈谈常用设计模式之建造者模式
这里找不到好的API中使用build的例子,之后找到了再补上. 我们直接来看建造者模式
建造者模式中的四种角色
- 产品
- 抽象建造者
- 实例建造者
- 指挥官(也就是build)
使用细节
- 客户端(使用程序的那一端)不必知道产品内部组成的细节,将产品本身与产品的常见过程解耦.
- 每一个具体建造者都相对独立,而与其他建造者无关,因此可以很方便的替换具体建造者或增加新的建造者,用户使用不同的具体建造者可得到不同的产品对象.
- 可以更加精细的控制产品创建过程,将复杂产品的常见步骤分解在不同的方法中,使创建过程更加清晰,也更方便使用程序来控制创建过程
- 增加新的具体建造者无需修改原有类库的代码,指挥者类真滴抽闲建造者类编程,系统扩展方便,符合OCP原则.
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的显示
- 如果产品内部变化复杂,也可能或导致需要定义很多具体的建造者类来实现这种变化,导致系统很庞大,因此在这种情况下也要考虑是否使用建造者模式
- 建造者模式和抽象工厂的对比
1. 抽象工厂实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只需要关心什么产品由什么工厂生产即可。
2. 建造者模式则是要求按照指定的蓝图建造产品,它主要的目的是通过组装零配件而产生一个新的配件
在理解了建造者模式的含义之后,我们来看看一个具体的建造者模式的实现
产品的实现:
package com.mzx.builder;
import lombok.Data;
import lombok.ToString;
/**
* @author ZhenXinMa
* @date 2020/1/26 20:16
*
* 产品
*
*/
@Data
@ToString
public class House {
private String houseBase;
private String walls;
private String roof;
}
抽象的建造者
package com.mzx.builder;
import java.security.PrivateKey;
/**
* @author ZhenXinMa
* @date 2020/1/26 20:17
*/
public abstract class HouseBuilder {
private House house = new House();
public House getHouse(){
return this.house;
}
public abstract void buildBase();
public abstract void buildWalls();
public abstract void roofed();
/**
* 建造好之后返回
* @return
*/
public House constructHouse(){
return house;
}
}
具体的建造者
package com.mzx.builder;
/**
* @author ZhenXinMa
* @date 2020/1/26 20:21
*
* 普通房子
*
*/
public class CommenHouseBuilder extends HouseBuilder {
// 这里是一个抽象建造者的具体实现. 其只是对抽闲建造者默认组件进行疯转,实现零件初始化.
@Override
public void buildBase() {
System.out.println("普通房子打地基5米");
super.getHouse().setHouseBase("普通房屋地基:5米");
}
@Override
public void buildWalls() {
System.out.println("普通房子围墙5米");
super.getHouse().setWalls("普通房屋围墙:5米");
}
@Override
public void roofed() {
System.out.println("封顶");
super.getHouse().setRoof("普通房子封顶");
}
}
指挥官: 建造者的含义
package com.mzx.builder;
/**
* @author ZhenXinMa
* @date 2020/1/26 20:23
*
* 指挥者 这里去指定建造流程 控制流程, 指挥官直面使用者, 使用者在使用的时候,只需要传入指定的建造者就可以初始化一个产品.
*
*/
public class HouseDirector {
// 这里传进来一个抽象建造者, 实现了面对抽象编程的思想,也符合了OCP原则.
private HouseBuilder builder = null;
public HouseDirector(HouseBuilder builder){
this.builder = builder;
}
public void setHouseBuilder(HouseBuilder builder){
this.builder = builder;
}
// 指挥官控制建造流程 .
public House build(){
builder.buildBase();
builder.buildWalls();
builder.roofed();
return builder.constructHouse();
}
}
客户端: 使用方
package com.mzx.builder;
import com.sun.org.apache.bcel.internal.generic.NEW;
/**
* @author ZhenXinMa
* @date 2020/1/26 20:48
*/
public class Client {
public static void main(String[] args) {
System.out.println("建筑普通房屋");
// 由于我们要构建一个普通的房屋, 所以说我们使用普通房屋的建造者对象进行构建
CommenHouseBuilder commenHouseBuilder = new CommenHouseBuilder();
// 而CommenHouseBuilder只是实现了建造者默认的行为,也就是只是初始化了零件, 具体按顺序组装有指挥官进行build操作.
HouseDirector director = new HouseDirector(commenHouseBuilder);
// 指挥官按给定的建造者进行顺序组装. 指挥官控制了流程.
House build = director.build();
System.out.println("输出建造好的普通房屋信息:"+build);
}
}
到了这里建造者模式就算介绍完了, 虽然代码很少,但是要读懂确实要花费很多时间!
如果上面有哪里理解的不对, 还请留言指出~