Java设计模式五:建造者模式

  建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。

一、定义与特点

  建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

  一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

  建造者模式举例:去肯德基点餐,我们可以认为点餐就属于一个建造订单的过程。我们点餐的顺序是无关的,点什么东西也是没有要求的,可以单点,也可以点套餐,也可以套餐加单点,但是最后一定要点确认来完成订单。

  • 建造者模式适用场景
    1、需要生成的对象具有复杂的内部结构。
    2、需要生成的对象内部属性本身相互依赖。
    3、创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的。
    4、创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。
    5、初始化一个对象特别复杂,如使用多个构造方法,或者说有很多参数,并且都有默认值时。

二、实现方式

(1)创建抽象产品类

  抽象产品类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;
	}
}

(2)创建产品类

  具体产品类MacBook

public class MacBook extends Computer {

	protected MacBook() {
	}

	@Override
	public void setOs() {
		os = "Mac OS X 13";
	}
}

(3)创建抽象类

  抽象类Builder

public abstract class Builder {

	abstract void buildBoard(String board);

	abstract void buildDisplay(String display);

	abstract void buildOs();

	abstract Computer build();
}

(4)抽象类具体实现类

  具体的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;
	}
}

(5)产品的具体构造类

  负责具体的构造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();
	}
}

(6)测试实现类

  测试建造者模式的实现

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


更新时间:2020-08-14 14:32:44

本文由 新逸Cary 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://blog.xinac.cn/archives/java-design-builder.html
最后更新:2020-08-14 14:32:44

评论

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×