建造者模式
我们前面学习了工厂方法模式和抽象工厂模式,知道了对象的创建可以转移到别的类中创建,那么如果要创建比较复杂的对象,但是创建的过程有一定的规律性,比如建房子,搭桥等有一定模式的,那么我们可以用到建造者模式。
定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
使用场景
1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2. 当构造过程必须允许被构造的对象有不同的表示时。
结构
实现
Product类的实现
public class Product {
private String title;
private String string;
private String item;
public void setTitle(String title) {
this.title = title;
}
public void setString(String string) {
this.string = string;
}
public void setItem(String item) {
this.item = item;
}
}
Builder接口的设计
public interface Builder {
void makeTitle();
void makeString();
void makeItem();
Product getResult();
}
具体的Builder的实现
public class HTMLBuilder implements Builder{
private Product htmlproduct;
public void makeTitle() {
htmlproduct.setTitle("htmlTitle");
}
public void makeString() {
htmlproduct.setString("htmlString");
}
public void makeItem() {
htmlproduct.setItem("htmlItem");
}
public Product getResult() {
return htmlproduct;
}
}
public class TextBuilder implements Builder{
private Product textproduct;
public void makeTitle() {
textproduct.setTitle("textTitle");
}
public void makeString() {
textproduct.setString("textString");
}
public void makeItem() {
textproduct.setItem("textItem");
}
public Product getResult() {
return textproduct;
}
}
Diector类的实现
public class Director {
private Builder builder;
public Director(Builder builder){
this.builder = builder;
}
public void construct() {
builder.makeTitle();
builder.makeString();
builder.makeItem();
}
}
我们来测试一下
public class BuilderTest {
public static void main(String[] args) {
Builder htmlbuilder = new HTMLBuilder();
Director director = new Director(htmlbuilder);
director.construct();
Product product = htmlbuilder.getResult();
}
}
建造者模式相比于抽象工厂模式和工厂方法模式,可以创建更加复杂的对象,实际生产中java mail应用的建造者模式来创建邮件的各个部分,有兴趣的朋友可以去看看源码,加深理解。