建造者模式
产品角色(用文章做例子)
package com.black.builder;
public class Article {
private String title;
private String author;
private String content;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
抽象建造者角色
package com.black.builder;
public abstract class Builder {
public abstract void buildTitle(String title);
public abstract void buildAuthor(String author);
public abstract void buildContent(String content);
public abstract Article retrieveResult();
}
具体建造者角色
package com.black.builder;
public class ArticleBuilder extends Builder {
private Article article = new Article();
@Override
public Article retrieveResult() {
// TODO Auto-generated method stub
return null;
}
@Override
public void buildAuthor(String author) {
// TODO Auto-generated method stub
}
@Override
public void buildContent(String content) {
// TODO Auto-generated method stub
}
@Override
public void buildTitle(String title) {
// TODO Auto-generated method stub
}
}
导演者角色
package com.black.builder;
import java.util.Map;
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct(Map map) {
this.builder.buildTitle((String)map.get("title"));
this.builder.buildAuthor((String)map.get("author"));
this.builder.buildContent((String)map.get("content"));
}
}
各角色分析
- 抽象建造者角色:一般是一个接口或者抽象类,定义了产品的各个零件的建造方法,该产品有多少零部件就有几个对应的方法;最后还要提供一个返回建造好的产品的方法;如果只有一个具体建造者可以省略;
- 具体建造者角色:建造的具体执行者,被客户端依赖;
- 导演者角色:根据各零部件参数,指导建造者建造产品;
- 产品角色:被建造的对象;
产品角色不一定非要是一种产品,可以是没有任何关联的两种或者多种产品,只需要让他们实现一个标识符接口;碰到零部件不同的可以进行缺省;根据实际情况,各个角色可以互相合并;
应用场景
- 当产品内部有负责的组件,该组件有可能是对象,也可能是属性;
- 当产品的组建对象之间有互相依赖,通过建造者模式可以理清依赖分布建造;
建造者模式可以是产品的内部构造清晰化,对客户端隐藏了复杂的产品时间生成,让客户端更加专注于业务的实现;各个builder之间相互独立,没有耦合;