设计模式-建造模式

建造模式是对象的创建模式。

建造模式可以将一个产品的内部表象和产品的生成过程分割开来,从而可以使一个建造过程生成不同的内部表象的产品对象。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


package com.hh.builder;

/**
 * 产品角色(标识接口)
 * @author hh
 * 2017-10-13
 */
public interface Product {
	
}
package com.hh.builder;

/**
 * 具体产品角色1
 * @author hh
 * 2017-10-13
 */
public class ConcreteProduct1 implements Product {
	// Anything pertaining to this product
}
package com.hh.builder;

/**
 * 具体产品角色2
 * @author hh
 * 2017-10-13
 */
public class ConcreteProduct2 implements Product {
	// Anything pertaining to this product
}
package com.hh.builder;

/**
 * 抽象建造者角色
 * @author hh
 * 2017-10-13
 */
public abstract class Builder {
	/**
	 * 产品零件建造方法
	 */
	public abstract void buildPart1();
	
	/**
	 * 产品零件建造方法
	 */
	public abstract void buildPart2();
	
	/**
	 * 产品返还方法
	 * @return
	 */
	public abstract Product retrieveResult();
}
package com.hh.builder;

/**
 * 具体建造者角色1
 * @author hh
 * 2017-10-13
 */
public class ConcreteBuilder1 extends Builder {
	private Product product = new ConcreteProduct1();
	
	@Override
	public void buildPart1() {
		// build the first part of the product		
	}

	@Override
	public void buildPart2() {
		// build the second part of the product
	}

	@Override
	public Product retrieveResult() {
		return product;
	}

}
package com.hh.builder;

/**
 * 具体建造者角色2
 * @author hh
 * 2017-10-13
 */
public class ConcreteBuilder2 extends Builder {
	private Product product = new ConcreteProduct2();
	
	@Override
	public void buildPart1() {
		// build the first part of the product		
	}

	@Override
	public void buildPart2() {
		// build the second part of the product
	}

	@Override
	public Product retrieveResult() {
		return product;
	}
}
package com.hh.builder;

/**
 * 导演者角色
 * @author hh
 * 2017-10-13
 */
public class Director {
	private Builder builder;
	
	/**
	 * 产品构造方法,负责调用各个零件建造方法
	 */
	public void construct() {
		builder = new ConcreteBuilder1();
		builder.buildPart1();
		builder.buildPart2();
		builder.retrieveResult();
	}
}
这是浅显的建造模式的实现,在这里有几项注意的

  1 Product是个标识接口,因为 具体的产品角色 是各种各样的,不一定能抽出相同的接口,但是为了更好的让 建造角色 更好的返回,所以设计了一个标识接口用来做标识

  2 Builder接口里面的方法不是一定的,因为 具体产品 的不同,它所拥有的属性就不相同,所以Builder里面可以不定义buildPart()方法,只定义一个retrieveResult()方法


建造模式有多种变种

  空的零件建造方法

    产品的内部结构细节大多可以与具体建造者类的接口无关,因为接口仅仅给出建造方法的特征而已。但是接口确实规定了具体建造者有几个零件建造方法,也就是说,抽象建造者角色确实规定了产品类必须有同样数目的零件,以及具体有几个零件。如果有一些产品有较多的零件,而有些产品有较少的零件,建造模式还可以使用吗?

    回答是肯定的。这些产品并不一定要有同样数目的零件才可以使用建造模式。如果一个产品有较少的零件,可以使用空的零件建造方法,忽略没有的零件。

    这种为不感兴趣的方法提供聘用实现的做法是缺省适配模式的精神。

  省略抽象建造者角色

    建造模式在是现实可以根据具体情况做一些变化。

    首先,如果设计师非常肯定系统只需要一个具体建造者角色的话,可以省略掉抽象建造者角色。抽象建造者角色存在的目的是规范具体建造者角色的行为,而系统如果有一个具体建造者,那么这个规范者角色就不需要了。

  省略导演者角色

    在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以进一步省略掉导演者角色。

    Builder角色自己扮演了导演者和建造者的双重角色


本文来自《java与模式》,为学习所用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值