【一天一个设计模式】—— 建造者模式 (Builder Pattern)

本文详细解读了建造者模式,阐述了如何通过分离构建和表示来创建不同表现形式的复杂对象,涉及Director、Builder、ConcreteBuilder和Product的角色。还通过电脑组装案例和代码演示了其实现原理和优缺点,以及它在特定场景的应用。

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

定义

Separate the construction of a complex object from its representation so that the same construction process can create different representations.
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

从定义的表示我们可以看出,建造者模式本质上就是一个建造工厂,它可以建造各种不同的对象,但是我们看不到其具体流程,即构建与表示分离

UML图
在这里插入图片描述
从图中可知,建造者模式由4部分组成:

  1. 指挥者Director
  2. 建造者Builder
  3. 具体建造者ConcreteBuiler
  4. 产品Product

1.指挥者Director,其作用是指挥产品建造的步骤和流程,即定义使用建造者Builder中的方法来生成实例的方法

2.建造者Builder,通常是一个接口或抽象类,其作用是定义出建造产品所需要的所有方法

3.具体建造者ConcreteBuiler,继承或实现建造者Builder,其作用是实现建造产品所需要的所有方法,并且定义获取最终产品的方法


下面通过代码来分析建造者模式。

假设你要去电脑城组装一台电脑,定义:电脑商铺老板为Director,电脑安装方案为Builder,装机人员为ConcreteBuilder,安装好的电脑为Product

1.创建Builder

//抽象类Builder
public  abstract class Builder {  
	//组装电脑的抽象方法(3步)
    public abstract void  BuildCPU();

    public abstract void BuildMainboard();
    
    public abstract void BuildHD();
	//定义获取最终产品的抽象方法
    public abstract Computer GetComputer();
}

2.创建Director

public class Director{
    //指挥装机人员组装电脑
    public void Construct(Builder builder){         
       builder.BuildCPU();
       builder.BuildMainboard();
       builder.BuildHD();
    }
 }

3.创建ConcreteBuilder

  public class ConcreteBuilder extend Builder{
 
    Computer computer = new Computer();

    //组装产品
    @Override
    public void BuildCPU(){  
       computer.Add("组装CPU")
    }  

    @Override
    public void BuildMainboard(){
       computer.Add("组装主板")
    }  

    @Override
    public void BuildHD(){
       computer.Add("组装主板")
    }  

    //返回组装好的电脑
     @Override
      public Computer GetComputer(){
      return computer
    }  
}

4.定义Product

public class Computer{
    
    //电脑零件的集合
    private List<String> parts = new ArrayList<String>()//用于将组件组装到电脑里
    public void Add(String part){
    	parts.add(part);
	}
	
    //显示建造信息
    public void Show(){
          for (int i = 0;i<parts.size();i++){    
          	  System.out.println("组件" + parts.get(i) + "装好了");
          }
          System.out.println("电脑组装完成,请验收");
	}

}

5.测试

public class Builder Pattern{
  public static void main(String[] args){
		//创建指挥者
		Director director = new Director();
		//创建建造者
		Builder builder = new ConcreteBuilder();
		//指挥者指挥传入过来的建造者建造产品
		director.Construct(builder);
		//获取最终产品
		Computer computer = builder.GetComputer();
		//显示建造过程
		computer.Show()}
}

通过代码可知,建造者模式的核心为建造者Builder、具体建造者ConcreteBuilder、指挥者Director,指挥者通过指挥传入过来的Builder执行建造方法,建造完成后,通过builder获取最终产品。


总结:

1.优点

  1. 易于解耦,将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。
  2. 易于精确控制对象的创建,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
  3. 易于拓展,增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则”
    — by:Carson带你学安卓*

2.缺点

  1. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  2. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
    — by:Carson带你学安卓

3.使用场景

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

建造者模式与工厂模式的不同:

建造者模式最主要的功能是基本方法的调用顺序安排,这些基本方法已经实现了,
顺序不同产生的对象也不同

工厂模式则重点是创建,创建零件是它的主要职责,而不关心组装顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Uranus^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值