建造者模式[读书笔记]

无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮、方向盘、发送机等各种部件。而对于大多数用户而言,无须知道这些部件的装配细节,也几乎不会使用单独某个部件,而是使用一辆完整的汽车,可以通过建造者模式对其进行设计与描述,建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节。

建设者模式

建设者模式(Builder Pattern):将一个复杂对象的构建与它的组装分离,使得同样的构建过程可以创建不同的表示。建设者模式是一种对象创建者模式。

从定义上看,建设者模式和工厂模式是非常相似的,具备创建与表示分离的特性。唯一区别于建设者模式是针对复杂对象的创建,工厂模式是针对简单对象的创建。

设计思想

在这里插入图片描述在这里插入图片描述

产品(Product):被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。

抽象建造类(Builder):建设者的抽象类,规范产品对象的各个组成部分的创建,一般由子类实现具体的创建过程。一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。

建设者(Concrete Builder):具体的Builder类,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象。

指挥者(Director):调用具体的建造类,创建对象的各个部分。在调用者中不涉及具体产品的信息,只负责保证对象各部分完整创建或者按某种顺序创建。

伪代码

//产品类
@Data
public class Product{
	//定义任何类型的组件
	private String partA;
	private String partB;
	private String partC;
}
//抽象建造类
public abstract class Builder{
	//创建产品对象
	protected Product product = new Product();
	//创建具体组件的抽象方法
	public abstract void buildPartA();
	public abstract void buildPartB();
	public abstract void buildPartC();
	//返回产品对象
	public Product getResult(){
		return product;
	}
}
//具体建造类A
public class ConcreteBuilderA extends Builder{
	//在具体的组件实现方法里,实现属性set
	public void buildPartA(){...};
	public void buildPartB(){...};
	public void buildPartC(){...};
}
//具体建造类B
public class ConcreteBuilderB extends Builder{
	//在具体的组件实现方法里,实现属性set
	public void buildPartA(){...};
	public void buildPartB(){...};
	public void buildPartC(){...};
}
//指挥者类
public class Director{
	private Builder builder;
	//有参构造
	public Director(Builder builder){
		this.builder = builder;
	}
	//setter
	public void setBuilder(Builder builder){
		this.builder = builder;
	}
	//产品构建于组装方法
	public Product construct(){
		builder.buildPartA();
		builder.buildPartB();
		builder.buildPartC();
		return builder.getResult();
	}
}

//客户端
public class Client{
	public static void main(String[] args){
		Builder builder = new ConcreteBuilderA();
		Director director = new Director(builder);
		Prouct product = director.construct();
	}
}

在建造者模式的结构中还引入了一个指挥者类Director,该类主要有两个作用:一方面它隔离了客户与创建过程;另一方面它控制产品的创建过程,包括某个buildPartX()方法是否被调用以及多个buildPartX()方法调用的先后次序等。

指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,通过指定具体建造者类型并指导Director类去生成产品对象。

优化

1.省略Director:在Builder抽象类中提供逐步构建复杂产品对象的construct()方法

//抽象建造类
public abstract class Builder{
	//创建产品对象
	protected Product product = new Product();
	//创建具体组件的抽象方法
	public abstract void buildPartA();
	public abstract void buildPartB();
	public abstract void buildPartC();
	//返回产品对象
	public Product getResult(){
		return product;
	}
	//由于是抽象类,因此将construct方法定义为static方法
	public static Product construct(ConcreteBuilder cb){
		cb.buildPartA();
		cb.buildPartB();
		cb.buildPartC();
		return cb.getResult();
	}
}

2.[类似]模板方法

public abstract class Builder{
	//创建产品对象
	protected Product product = new Product();
	//创建具体组件的抽象方法
	public abstract void buildPartA();
	public abstract void buildPartB();
	public abstract void buildPartC();
	//定义了创建产品对象的流程
	public Product construct(){
		this.buildPartA();
		this.buildPartB();
		this.buildPartC();
		return product;
	}
}
public class ConcreteBuilder extends Builder{
	public void buildPartA(){...};
	public void buildPartB(){...};
	public void buildPartC(){...};
}
public class Client{
	public static void main(String[] args){
		ConcreteBuilder cb = new ConcreteBuilder();
		Product product = cb.construct();
	}
}

建设者模式的扩展

建造者模式与工厂模式的比较:
(1)建设者模式更注重组件的创建顺序,工厂模式更注重创建对象
(2)建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来的对象都一样

建设者模式的优点
(1)封装性好,构建和表示分离。
(2)扩展性好,建造类之间独立,在一定程度上解耦。
(3)便于控制细节,建造者可以对创建过程逐步细化,而不对其他模块产生任何影响。

建设者模式的缺点
(1)需要多创建一个Builder对象。
(2)如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。


参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值