设计模式系列--Builder
一.类图
二.意图
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
三.适用性
a) 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
b) 当构造过程必须允许被构造的对象有不同的表示时。
四.实例
首先声明我是一个技术男,所以我在学校做过不少项目。有自己独立完成的,也有和别人合作完成的大项目。一天我们Java小分队接了一个大项目,经过一番讨论之后技术选型是这样的:SSH+MySQL。但是团队中之后组长精通Spring。无奈只有等组长封装好底层接口后我们再进行各自模块的开发,然后把各模块交给组长,组长各模块的集成。
package explore.builder;
public class WebSite {
private String partOne;
private String partTwo;
private String partThree;
public String getPartOne() {
return partOne;
}
public void setPartOne(String partOne) {
this.partOne = partOne;
}
public String getPartTwo() {
return partTwo;
}
public void setPartTwo(String partTwo) {
this.partTwo = partTwo;
}
public String getPartThree() {
return partThree;
}
public void setPartThree(String partThree) {
this.partThree = partThree;
}
@Override
public String toString() {
return partOne + "\n" + partTwo + "\n" + partThree + "\n" + "website can submit!!";
}
}
package explore.builder;
public class TeamLeader {
public void packageing(PartBuilder builder) {
builder.doPartOne();
builder.doPartTwo();
builder.doPartThree();
}
}
package explore.builder;
public interface PartBuilder {
public void doPartOne();
public void doPartTwo();
public void doPartThree();
}
package explore.builder;
public class Members implements PartBuilder {
private String partOne = null;
private String partTwo = null;
private String partThree = null;
@Override
public void doPartOne() {
partOne = new String("partOne has finished!");
}
@Override
public void doPartTwo() {
partTwo = new String("partTwo has finished!");
}
@Override
public void doPartThree() {
partThree = new String("partThree has finished!");
}
public WebSite submit() {
WebSite site = null;
if(partOne != null && partTwo != null && partThree != null) {
site = new WebSite();
site.setPartOne(partOne);
site.setPartTwo(partTwo);
site.setPartThree(partThree);
}
return site;
}
}
package explore.builder;
public class Client {
public static void main(String[] args) {
Members m = new Members();
TeamLeader leader = new TeamLeader();
leader.packageing(m);
WebSite site = m.submit();
System.out.print(site);
}
}
五.StringBuilder中的Builder模式
public StringBuilder append(String str) {
super.append(str);
return this;
}
... ...
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
//有了这样的方法,我们就可以进行这样的链式编程
String str = new StringBuilder().append("a").append("b").toString();
当你看到这里的时候可能会有疑问,这是Builder模式吗??为什么这么多的成员流失了?有这样疑问的请看一下《effective java》中的关于Builder的一个例子(第二条)。这个例子只不过将Builder和Director集于一身了。