建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
建造者模式举例:去肯德基点餐,我们可以认为点餐就属于一个建造订单的过程。我们点餐的顺序是无关的,点什么东西也是没有要求的,可以单点,也可以点套餐,也可以套餐加单点,但是最后一定要点确认来完成订单。
  抽象产品类Computer
public abstract class Computer {
	// 主板
	protected String board;
	// 显示器
	protected String display;
	// 操作系统
	protected String os;
	protected Computer() {
	}
	public void setBoard(String board) {
		this.board = board;
	}
	public void setDisplay(String display) {
		this.display = display;
	}
	public abstract void setOs();
	@Override
	public String toString() {
		return "主板型号:" + board + ", 显示器型号:" + display + ", 操作系统:" + os;
	}
}
  具体产品类MacBook
public class MacBook extends Computer {
	protected MacBook() {
	}
	@Override
	public void setOs() {
		os = "Mac OS X 13";
	}
}
  抽象类Builder
public abstract class Builder {
	abstract void buildBoard(String board);
	abstract void buildDisplay(String display);
	abstract void buildOs();
	abstract Computer build();
}
  具体的Builder实现类,具体的创建对象的类
public class MacBookBuilder extends Builder {
	private Computer computer = new MacBook();
	@Override
	public void buildBoard(String board) {
		computer.setBoard(board);
	}
	@Override
	public void buildDisplay(String display) {
		computer.setDisplay(display);
	}
	@Override
	public void buildOs() {
		computer.setOs();
	}
	@Override
	public Computer build() {
		return computer;
	}
}
  负责具体的构造Computer,统一组建过程
public class Director {
	Builder builder = null;
	public Director(Builder builer) {
		this.builder = builer;
	}
	public void construct(String board, String display) {
		builder.buildDisplay(display);
		builder.buildBoard(board);
		builder.buildOs();
	}
}
测试建造者模式的实现
public class Test {
	public static void main(String[] args) {
		Builder builder = new MacBookBuilder();
		Director pcDirector = new Director(builder);
		pcDirector.construct("英特尔主板", "Retina显示器");
		Computer computer = builder.build();
		System.out.println(computer.toString());
	}
}
测试输出内容
主板型号:英特尔主板, 显示器型号:Retina显示器, 操作系统:Mac OS X 13
注意事项
  为了灵活构造复杂对象,该对象会有多个成员变量,在外部调用的时候,不需要或者不方便一次性创建出所有的成员变量,在这种情况下,使用多个构造方法去构建对象,很难维护,这时候Builder设计模式解决这个问题,进行buid()方法中创建对象,并且将builder传入,该builder中,维护了传入对象的成员变量。
  与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
优缺点
1、各个具体的建造者相互独立,有利于系统的扩展。
2、客户端不必知道产品内部组成的细节,便于控制细节风险。
3、产品的组成部分必须相同,这限制了其使用范围。
4、如果产品的内部变化复杂,该模式会增加很多的建造者类。
模式结构
1、产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个部件。
2、抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法。
3、具体建造者(Concrete Builder):实现Builder接口,完成复杂产品的各个部件的具体创建方法。
4、指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
参考文章
1、http://c.biancheng.net/view/1354.html
2、https://www.runoob.com/design-pattern/builder-pattern.html
3、https://www.runoob.com/w3cnote/builder-pattern.html
                    本文由 新逸Cary 创作,如果您觉得本文不错,请随意赞赏
                    采用 知识共享署名4.0 国际许可协议进行许可
                    本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
                    原文链接:https://blog.xinac.cn/archives/java-design-builder.html
                    最后更新:2020-08-14 14:32:44
                
Update your browser to view this website correctly. Update my browser now