建造模式是对象的创建模式。
建造模式可以将一个产品的内部表象和产品的生成过程分割开来,从而可以使一个建造过程生成不同的内部表象的产品对象。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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与模式》,为学习所用