大话设计模式读书笔记(十) 建造者模式

建造者模式

建造者模式(Builder):

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

建造者模式UMl类图:




建造者模式简单代码实现:

具体产品类
public class Product {
	//产品部件
	private List<String> parts = new ArrayList<String>();
	//添加产品部件
	public void addPart(String part){
		parts.add(part);
	}
	public void show(){
		System.out.println("\n产品   创建---");
		for (String part : parts) {
			System.out.println(part);
		}
	}
}
建造者接口

public interface Builder {
	public void buildPartA();
	public void buildPartB();
	
	public Product getResult();
}

建造者接口实现
public class ConcreteBuilder implements Builder{
	private Product product= new Product();
	@Override
	public void buildPartA() {
		product.addPart("部件A");
	}
	@Override
	public void buildPartB() {
		product.addPart("部件B");
	}
	@Override
	public Product getResult() {
		return product;
	}
}


public class ConcreteBuilder2 implements Builder{
	private Product product= new Product();
	@Override
	public void buildPartA() {
		product.addPart("部件X");
	}
	@Override
	public void buildPartB() {
		product.addPart("部件Y");
	}
	@Override
	public Product getResult() {
		return product;
	}
}

指挥者类
public class Director {
	public void construct(Builder builder){
		builder.buildPartB();
		builder.buildPartA();
	}
}
主方法
public class Mian {
	public static void main(String[] args) {
		Director director = new Director();
		Builder b1= new ConcreteBuilder();
		Builder b2= new ConcreteBuilder2();
		director.construct(b1);
		Product p = b1.getResult();
		p.show();
		
		director.construct(b2);
		Product p2 = b2.getResult();
		p2.show();
	}
}

建造者模式与工厂模式的比较:

建造者模式的结构中引入了一个指挥者类Director,该类的作用主要有两个:
一、它隔离客户与生产过程;
二、它负责控制产品的生成过程。指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,无须关心产品对象的具体组装过程,即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象。

建造者模式与抽象工厂模式的比较:
与抽象工厂模式相比, 建造者模式返回一个组装好的完整产品 ,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。
在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象。
如果将抽象工厂模式看成汽车配件生产工厂 ,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂 ,通过对部件的组装可以返回一辆完整的汽车。



posted @ 2017-04-16 14:31  Will_Don  阅读(198)  评论(0编辑  收藏  举报