应用场景
将复杂对象的构建与它的表示分离开来,使得同样的构建过程可以 创建不同的表示。举个简单例子:自定义游戏角色时,游戏角色由: 性别,脸部,衣服三个部分组成,我们根据自己的喜好进行选择, 最终胜出一个自定义的角色,不同的组成部分,最后生成的角色 也不一样。
组成部分(四个角色)
- Product —— 产品类
- Builder —— 抽象的Builder类,规范产品的组建,一般由子类实现具体过程
- ConcreteBuilder —— Builder的实现类,实现Builder类中定义方法,并返回组建好的对象
- Director——统一组装过程(现实开发中,一般被省略,直接使用一个Builder来进行对象的组装)
UML类图如下:
![]() |
代码实现示例:
package builderPattern;
/**
* 建造者模式测试例程
* @Package builderPattern
* @Title: BuilderPatternDemo.java
* @Company: $
* @author BurgessLee
* @date 2018年10月10日-上午11:15:01
* @Description: $
*/
public class BuilderPatternDemo{
public static void main(String[] args) {
Builder builder = new CharacterBuilder();
Director director = new Director(builder);
Character character = director.createCharacter("基佬", "硬汉脸", "死库水");
String showMsg = character.showMsg();
System.out.println(showMsg);
}
}
//类似于Product
class Character {
//创建成员属性
private String sex;
private String face;
private String clothes;
public void setSex(String sex){
this.sex = sex;
}
public void setFace(String face){
this.face = face;
}
public void setClothes(String clothes){
this.clothes = clothes;
}
//输出对应的信息
public String showMsg(){
return "你创建了一个穿着"+this.clothes +"一副"+ face +"的"+ sex +"在微笑O(∩_∩)O哈哈~";
}
}
//创建Builder接口
interface Builder{
public void setSex(String sex);
public void setFace(String face);
public void setClothes(String clothes);
//提供同一个的创建Product的接口方法
public Character build();
}
//创建concreteBuilder builder的实现类
class CharacterBuilder implements Builder{
private Character character = new Character();
@Override
public void setSex(String sex) {
character.setSex(sex);
}
@Override
public void setFace(String face) {
character.setFace(face);
}
@Override
public void setClothes(String clothes) {
character.setClothes(clothes);
}
@Override
public Character build() {
return this.character;
}
}
//创建Director 用来中返回Product
class Director{
private Builder builder = null;
public Director(Builder builder) {
this.builder = builder;
}
public Character createCharacter(String sex, String face, String clothes){
this.builder.setSex(sex);
this.builder.setFace(face);
this.builder.setClothes(clothes);
return this.builder.build();
}
}
输出结果:
你创建了一个穿着死库水一副硬汉脸的基佬在微笑O(∩_∩)O哈哈~
优缺点
优点:
- 简化复杂对象构建,对象本身与创建过程解耦,无需知道具体的
内部实现细节,相同的创建过程可以创建不同的产品对象;
缺点:
- 可能会产生多余的建造者和构建过程对象,消耗内存;
- 不适用与内部建造顺序不稳定,变化复杂的对象,可能导致需要创建很多具体建造者来实现这些变化。