创建型(五)—建造者模式

1、定义

Separate the construction of a complex object from its representation so that the same construction process can create different representations.

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

2、使用场景

  1. 相同的方法,不同的执行顺序,产生不同的结果时
  2. 多个部件或零件,都可以装配到同一个对象时,但是产生的运行结果又不相同时
  3. 产品类非常复杂,或者产品类中的方法调用顺序不同会产生不同的效果
  4. 初始化一个对象特别复杂,如参数多,且很多参数有具有默认值

3、UML类图


角色介绍:

  1. 抽象建造者Builder:用于规范产品的各个组成部分,并进行抽象,一般独立于应用程序的逻辑。
  2. 具体建造者ConcreteBuilder:实现Builder中定义的所有方法,并且返回一个组件好的产品
  3. 产品Product:建造中的复杂产品
  4. 导演者Director:统一组装过程

4、示例

计算机的组装过程较为复杂,并且组装顺序不固定,为了方便,我们把计算机组装的过程简化成构建主机、设置操作系统、设置显示器3个部分,然后通过Director和具体的Builder来构建计算机对象。

/**
 * 计算机抽象类,即Product
 * @author Administrator
 *
 */
public class Computor {
	private String  board;
	private String display;
	private String os;
	public String getBoard() {
		return board;
	}
	public void setBoard(String board) {
		this.board = board;
	}
	public String getDisplay() {
		return display;
	}
	public void setDisplay(String display) {
		this.display = display;
	}
	public String getOs() {
		return os;
	}
	public void setOs(String os) {
		this.os = os;
	}
	@Override
	public String toString() {
		return "Computor [board=" + board + ", display=" + display + ", os=" + os + "]";
	}
}
/**
 * 具体产品类
 * @author Administrator
 *
 */
public class MacBook extends Computor{
	
}
/**
 * 抽象的Builder类
 * @author Administrator
 *
 */
public abstract class Builder {
	// 设置主机
	public abstract void buildBoard(String board);
	// 设置显示器
	public abstract void buildDisplay(String display);
	// 设置操作系统
	public abstract void buildOS();
	// 创建Computor
	public abstract Computor create();
}
/**
 * 抽象的Builder类
 * @author Administrator
 *
 */
public abstract class Builder {
	// 设置主机
	public abstract void buildBoard(String board);
	// 设置显示器
	public abstract void buildDisplay(String display);
	// 设置操作系统
	public abstract void buildOS();
	// 创建Computor
	public abstract Computor create();
}
/**
 * 抽象的Builder类
 * @author Administrator
 *
 */
public abstract class Builder {
	// 设置主机
	public abstract void buildBoard(String board);
	// 设置显示器
	public abstract void buildDisplay(String display);
	// 设置操作系统
	public abstract void buildOS();
	// 创建Computor
	public abstract Computor create();
}
/**
 * 客户端调用
 * @author Administrator
 *
 */
public class Client {

	public static void main(String[] args) {
		Builder builder = new MacBookBuilder();
		Director director = new Director(builder);
		director.construct("英特尔主板", "Retina显示器");
		System.out.println("Computor info : " + builder.create().toString());
 	}
}

5、总结

优点:

  1. 封装性,使得客户端不避知道产品内部的组成细节
  2. 建造者独立,容易扩展
  3. 易于控制细节风险,由于建造者是独立的,因此对构建造过程逐步细化,不会对其他模块产生任何影响,

缺点:

  1. 产生多余的Builder对象以及Director对象,消耗内存


猜你喜欢

转载自blog.csdn.net/zcjxaiofeizhu/article/details/80714307