View on GitHub

severalfly 个人博客

severalfly 个人博客,一起分享知识

Download this project as a .zip file Download this project as a tar.gz file

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

依然是来个例子

首先是我们要构建的产品,包含一个添加方法与显示方法

public class Product
{
	private List<String> parts = new ArrayList<String>();

	public void add(String part)
	{
		this.parts.add(part);
	}
	public void show()
	{
		System.out.println("\n产品创建---");
		for (String string : this.parts)
		{
			System.out.println(string);
		}
	}
}

然后是个建造者类,这是个虚类,所有方法都是虚的,子类必须实现所有方法才行,这就避免了在实际创建时缺少某些步骤的情况

public abstract class Builder
{
	abstract public void bilderPartA();

	abstract public void bilderPartB();

	abstract public Product getResult();
}

第一个具体类,实现父类的方法,也就是给产品加些字符串,也是在实际代码中给产品增加的新内容

public class ConcreteBuilder1 extends Builder
{
	private Product product = new Product();

	@Override
	public void bilderPartA()
	{
		this.product.add("部件A");
	}

	@Override
	public void bilderPartB()
	{
		this.product.add("部件B");

	}

	@Override
	public Product getResult()
	{
		return this.product;
	}
}

第二个子类,同上

public class ConcreteBuilder2 extends Builder
{
	private Product product = new Product();

	@Override
	public void bilderPartA()
	{
		this.product.add("部件K");
	}

	@Override
	public void bilderPartB()
	{
		this.product.add("部件L");

	}

	@Override
	public Product getResult()
	{
		return this.product;
	}
}

指挥官,这牛逼角色,控制着构建过程,

public class Director
{
	public void construct(Builder builder)
	{
		builder.bilderPartA();
		builder.bilderPartB();
	}
}

客户端就很简单了,感觉与前面的几种模式有很大的相同点

public class BuilderMain
{
	public static void main(String[] args)
	{
		Director director = new Director();

		Builder builder = new ConcreteBuilder1();
		director.construct(builder);
		Product p1 = builder.getResult();
		p1.show();

		builder = new ConcreteBuilder2();
		director.construct(builder);
		Product p2 = builder.getResult();
		p2.show();
	}
}

总结:这个模式主要用在那些构建细节比较复杂,构建过程又比较单一,可以将这个过程总结出来,放到父类中强制子类实现;指挥官的角色会保证构建过程的完整。