设计模式-----建造者模式

本文深入解析建造者模式的定义及其实现方式,介绍了Director、ConcreteBuilder等关键角色,并通过实例展示了如何利用建造者模式实现不同产品类的构建,强调了其在面对不同执行顺序时的应用价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

建造者模式

建造者模式的定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

这里写图片描述

  • Director导演类—–负责安排已有的模块的顺序,然后通知builder进行构建
  • ConcreteBuilder具体建造者——实现抽象类的所有方法,返回一个组件好的对象
  • Product产品类——–具体的产品类
  • Builder抽象建造者——-规范建造者的规范

建造者模式的实践

在模板模式中,我们通过将run方法进行重构,将run方法的实现写到了抽象类中,从而具体实现不需要再次进行实现,从而实现了模板模式。

在建造者模式中,新的需求要求各个模型的生产可以自由的调整各个方法的运行次序。为此我们重新进行建模
这里写图片描述

可以看到在CarModel中,我们添加了arraylist类型的sequence,然后根据sequence中,定义方法的次序,来依次执行方法。

public abstract class CarModel {        
//这个参数是各个基本方法执行的顺序     
private ArrayList<String> sequence = new ArrayList<String>();       
//模型是启动开始跑了     
protected abstract void start();        
//能发动,还要能停下来,那才是真本事     
protected abstract void stop();         
//喇叭会出声音,是滴滴叫,还是哔哔叫     
protected abstract void alarm();        
//引擎会轰隆隆地响,不响那是假的     
protected abstract void engineBoom();           
//那模型应该会跑吧,别管是人推的,还是电力驱动,总之要会跑     final public void run() {                       
//循环一边,谁在前,就先执行谁
     for(int i=0;i<this.sequence.size();i++){                      String actionName = this.sequence.get(i);                                       if(actionName.equalsIgnoreCase("start")){                                this.start();  //启动汽车                      
}else if(actionName.equalsIgnoreCase("alarm")){                               this.alarm(); //喇叭开始叫了                       
}else if(actionName.equalsIgnoreCase("engine boom")){                                                            //如果是engine boom关键字                              this.engineBoom();  //引擎开始轰鸣                       }             
}               
}       
//把传递过来的值传递到类内     
final public void setSequence(ArrayList sequence){             this.sequence = sequence;     } 
}

CarModel的设计原理是这样的,setSequence方法是允许客户自己设置一个顺序,是要先启动响一下喇叭再跑起来,还是要先响一下喇叭再启动。对于一个具体的模型永远都固定 的,但是对N多个模型就是动态的了。在子类中实现父类的基本方法,run()方法读取 sequence,然后遍历sequence中的字符串,哪个字符串在先,就先执行哪个方法。

通过这样我们可以通过不同的sequence来设计不同的车模型,但是这样设计,我们只完成一个模型的设计,后面还有很多有什么好的解决办法呢?

对此我们再次对代码进行重构
这里写图片描述

增加了一个CarBuilder抽象类,由它来组装各个车模,要什么类型什么顺序的车辆模 型,都由相关的子类完成。

public abstract class CarBuilder {     
    //建造一个模型,你要给我一个顺序要求,就是组装顺序     
    public abstract void setSequence(ArrayList<String> sequence);     
    //设置完毕顺序后,就可以直接拿到这个车辆模型     
    public abstract CarModel getCarModel(); 
}
public class BenzBuilder extends CarBuilder {     private BenzModel benz = new BenzModel();     
public CarModel getCarModel() {             
return this.benz;     
}     
public void setSequence(ArrayList<String> sequence) {               this.benz.setSequence(sequence);     
} 
}

至此,我们可以通过不同的Builder创造出不同的模型。但是在创造的过程中,仍然需要外部对顺序进行置顶。因此我们再次将Builder进行封装

这里写图片描述

在Direct中我们提供不同的方法,封装不同的执行顺序的模型,而客户端无须知道具体的实现,操作非常简单。

至此我们的建造者模式构建完成。

建造者模式的优点

  • 封装性——–客户端不需要知道产品的内部细节
  • 建造者独立———容易横向进行扩展,增加不同的Builder
  • 便于控制细节风险——–具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

建造者模式的使用场景

  • 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适

注意事项

建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建类模式,但是注重点不同。工厂类注重对象的创建,建造者模式注重对象创建的内部的顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值