建造者模式

概述

当复杂的构建过程通常不变,改变的只是内部的实现算法和业务逻辑时使用;
将复杂的构建过程和具体的内部实现相分离,使得构建过程公用化。

UML

结构

产品:需要被建造的目标;
抽象建造者:规划好建造者类的任务,如需要实现A项任务,B项任务和C项任务,需要返回指定产品;
具体建造者:具体实现每项任务,如怎样实现A项任务,B项任务和C项任务;
指挥者:指挥完成任务的顺序和方式,如先完成A项任务再完成B项任务,再有选择地完成C项任务,需要指定具体的建造者和安排建造顺序。

代码

package com.builder;
// 以下有两个类
/**
 * 产品类
 */
public class Product {
	private String componentA;
	private String componentB;

	public String getComponentA() {
		return componentA;
	}

	public void setComponentA(String componentA) {
		this.componentA = componentA;
	}

	public String getComponentB() {
		return componentB;
	}

	public void setComponentB(String componentB) {
		this.componentB = componentB;
	}

	public void show() {
		System.out.println(toString());
	}

	@Override
	public String toString() {
		return "Product [componentA=" + componentA + ", componentB="
				+ componentB + "]";
	}
}

/**
 * 创建者抽象类
 */
public abstract class Builder {
	protected Product product = new Product();
	public abstract void buildOne();
	public abstract void buildTwo();
	public Product getResult() {
		return product;
	}
}
package com.builder;
// 以下有三个类
/**
 * 建造者A类
 */
public class ConcreteBuilderA extends Builder {

	@Override
	public void buildOne() {
		product.setComponentA("建造者A组件1");
	}

	@Override
	public void buildTwo() {
		product.setComponentB("建造者A组件2");
	}
}

/**
 * 建造者B类
 */
public class ConcreteBuilderB extends Builder {

	@Override
	public void buildOne() {
		product.setComponentA("建造者B组件1");
	}

	@Override
	public void buildTwo() {
		product.setComponentB("建造者B组件2");
	}
}

/**
 * 指挥者类
 */
public class Director {

	private Builder builder;

	public Director(Builder builder) {
		this.builder = builder;
	}

	public void construct() {
		builder.buildOne();
		builder.buildTwo();
	}

}
/**
 * 测试类
 */
public class TestMain {
	public static void main(String[] args) {
		Builder builderA = new ConcreteBuilderA();
		Director director = new Director(builderA);
		director.construct();
		Product productA = builderA.getResult();
		productA.show();
		
		Builder builderB = new ConcreteBuilderB();
		director = new Director(builderB);
		director.construct();
		Product productB = builderB.getResult();
		productB.show();
	}
}

  优缺点

优点:建造者独立,便于扩展,如果有新的内部逻辑只需继承/实现建造者即可,细节修改不容易影响其他逻辑;
缺点:结构相对固化,不同的构造过程难以使用同一个指挥者,如果内部细节变化过多需要更多的建造者类。

才疏学浅,如文中有错误,感谢大家指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值