设计模式学习--生成器(Builder)模式

  • 意图
  • 将一个复杂对象的构建与它的表示分离,使得同样的构建构成可以创建不同的表示。
  • 适用性
  • ⑴当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
    ⑵当构造过程必须允许被构造的对象有不同的表示时
  • 结构
  • 参与者
  • ⑴Builder:生成器统一接口(或者抽象类,若是抽象类,可以更加自由地选择将方法定义为抽象方法或者钩子方法)
    ⑵ConcreteBuilder:Builder接口的实现类,用以构造和装配复杂对象的各个部件,并提供一个返回产品的接口方法
    ⑶Dirctor:导向器,用于构造一个使用Builder接口的对象
    ⑷Product:表示被构造的复杂对象
  • 协作
  • ⑴客户创建Director对象,并用它所想要的Builder对象进行配置
    ⑵通过Director对象的construct方法构建复杂对象(生成各个组件并进行组装)
    ⑶通过Builder对象获取构造完成的复杂对象
  • 代码示例
  • /**
     * @描述:生成器统一接口
     * @创建时间:2015-9-28 上午9:55:15
     */
    public interface Builder {
    	void buildPart1();
    
    	void buildPart2();
    
    	Product getResult();
    }

    public class ConcreteBuilder1 implements Builder {
    	private Product product;
    	
    	// part1与part2分别属于复杂对象的一部分,有自己的装配逻辑
    	@Override
    	public void buildPart1() {
    		product = new Product();
    		product.add("PartA");
    	}
    
    	@Override
    	public void buildPart2() {
    		product.add("PartB");
    	}
    
    	@Override
    	public Product getResult() {
    		return product;
    	}
    
    }
    
    public class ConcreteBuilder2 implements Builder {
    	private Product product;
    	
    	@Override
    	public void buildPart1() {
    		product = new Product();
    		product.add("PartX");
    	}
    
    	@Override
    	public void buildPart2() {
    		product.add("PartY");
    	}
    
    	@Override
    	public Product getResult() {
    		return product;
    	}
    
    }

    /**
     * @描述:导向器,用于构造一个使用Builder接口实例的对象
     * @创建时间:2015-9-28 上午10:02:34
     */
    public class Director {
    	public void construct(Builder builder) {
    		builder.buildPart1();
    		builder.buildPart2();
    	}
    }

    /**
     * @描述:表示被构造的复杂对象
     * @创建时间:2015-9-28 上午9:48:25
     */
    public class Product {
    	List<String> parts = new ArrayList<>();
    
    	public void add(String part) {
    		parts.add(part);
    	}
    
    	public void show() {
    		System.out.println("-----------Product Parts-----------");
    		for (String part : parts) {
    			System.out.println(part);
    		}
    	}
    }

    /**
     * @描述:⑴  客户创建Director对象,并用它所需要的Builder对象进行配置
     * 		   ⑵  一旦产品部件被生成,导向器就会通知生成器
     *  	   ⑶ 生成器处理导向器的请求,并将部件添加到该产品中
     *  	   ⑷ 客户从生成器中检索产品
     * @创建时间:2015-9-28 上午10:06:12
     */
    public class TestClient {
    	public static void main(String[] args) {
    		// 导向器可以被多个建造者共用
    		Director direc = new Director();
    		
    		Builder builder1 = new ConcreteBuilder1();
    		Builder builder2 = new ConcreteBuilder2();
    		
    		// 构造复杂对象(每个复杂对象的组件先后生成并组装,然后完成复杂对象的构造)
    		direc.construct(builder1);
    		// 通过生成器对象获取构造完成的复杂对象
    		Product p1 = builder1.getResult();
    		p1.show();
    		
    		// 构造复杂对象(每个复杂对象的组件先后生成并组装,然后完成复杂对象的构造)
    		direc.construct(builder2);
    		// 通过生成器对象获取构造完成的复杂对象
    		Product p2 = builder2.getResult();
    		p2.show();
    	}
    }

  • 参考资料
  • 《设计模式:可复用面向对象软件的基础》
    例子来源: http://www.cnblogs.com/lds85930/articles/643143.html

    猜你喜欢

    转载自linyinpeng1989.iteye.com/blog/2246485
    今日推荐