设计模式 -- Builder(构建器)
构建器(Builder)
将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)
在软件系统中,有时候面临着“一个复杂对象”的创建工作,期通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却相对稳定。
Builder其实和Template Method有一些相似,而Builder主要是为了解决对象创建的问题
即一个对象创建后需要做一部分固定的工作、可以交由构建器做这一部分工作后返回
代码
假设需要构建一个房屋的对象,这个房子的建造过程相对固定的,比如打地基、修墙、装门等等,虽然步骤相对固定,但是具体的墙、门、窗可能都存在差异。
那么使用如下的代码,把固定的部分实现为接口的流程(这里的做法很像Template Method)。
具体的房子只需要实现House的类,并重写那些接口方法就行了。
方式1
interface House{
//....
};
// 房屋构建抽象类
abstract class HouseBuilder {
House house;
protected HouseBuilder(House house) {
this.house = house;
}
public House GetResult(){
return house;
}
protected House Init() {
BuildPart1();
for (int i = 0; i < 4; i++){
BuildPart2();
}
BuildPart3();
BuildPart4();
BuildPart5();
return GetResult();
}
protected abstract void BuildPart1();
protected abstract void BuildPart2();
protected abstract void BuildPart3();
protected abstract void BuildPart4();
protected abstract void BuildPart5();
};
// 房屋具体实现类
class StoneHouse implements House {
};
// 房屋构建具体实现类
class StoneHouseBuilder extends HouseBuilder {
protected StoneHouseBuilder(House house) {
super(house);
}
public void BuildPart1(){
// house.part1
}
public void BuildPart2(){
}
public void BuildPart3(){
}
public void BuildPart4(){
}
public void BuildPart5(){
}
};
public class Main {
private HouseBuilder houseBuilder;
public Main(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
@Test
public void T1() {
// 由里面的房屋构造器做了一系列复杂的操作后返回对象
House house = houseBuilder.Init();
}
}
方式2
interface House{
//....
};
// 房屋构建抽象类
abstract class HouseBuilder {
House house;
protected HouseBuilder(House house) {
this.house = house;
}
public House GetResult(){
return house;
}
protected abstract void BuildPart1();
protected abstract void BuildPart2();
protected abstract void BuildPart3();
protected abstract void BuildPart4();
protected abstract void BuildPart5();
};
// 房屋具体实现类
class StoneHouse implements House {
};
// 房屋构建具体实现类
class StoneHouseBuilder extends HouseBuilder {
protected StoneHouseBuilder(House house) {
super(house);
}
public void BuildPart1(){
// house.part1
}
public void BuildPart2(){
}
public void BuildPart3(){
}
public void BuildPart4(){
}
public void BuildPart5(){
}
};
class HouseDirector {
public HouseBuilder houseBuilder;
HouseDirector(HouseBuilder houseBuilder){
this.houseBuilder = houseBuilder;
}
House Construct(){
houseBuilder.BuildPart1();
for (int i = 0; i < 4; i++){
houseBuilder.BuildPart2();
}
houseBuilder.BuildPart3();
houseBuilder.BuildPart4();
houseBuilder.BuildPart5();
return houseBuilder.GetResult();
}
};
public class Main {
private HouseDirector houseDirector;
public Main(HouseDirector houseDirector) {
this.houseDirector = houseDirector;
}
@Test
public void T1() {
// 由里面的房屋构造器做了一系列复杂的操作后返回对象
House house = houseDirector.Construct();
}
}
总结
Builder模式主要用于“分步骤构建一个复杂对象”。在这其中“分步骤”是一个稳定算法,而复杂对象的各个部分则经常变化。
变化的点在哪里,封装哪里——Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法的需求变动”。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)