已造房子为例,建造者模式包括产品Product(房子)、设计者Designer、包工头WorkBuilder。
1.传统的建造者模式
//1.产品类代表一个房子
public class Product(){
private String window;
private String door;
public setWindow(String window){
this.window = window;
}
public setDoor(String door){
this.door = door;
}
}
//2.抽象的建造类
public interface Builder{
void createWindow();
void createDoor();
Product generateProduct();
}
//3.具体的建造者包工头
public class WorkBuilder implements Builder{
private Product product = new Product();
@Override
public void createWindow(){
product.setWindow("方形窗户");
}
@Override
public void createDoor(){
product.setDoor("拱形门");
}
@Override
public Product generateProduct(){
return product;
}
}
//4.设计者设计房子
//设计者设计房子的窗户和门
//实现门和窗户是交给建造者
public class Designer{
public void design(Builder builder){
builder.createWindow();
builder.createDoor();
}
}
//5.客户端调用
public class Client{
public static void main(String[] args){
//1.创建建造者
Builder worker = new WorkBuilder();
//2.创建设计者
Desinger designer = new Desinger();
//3.设计者设计产品
designer.design(worker);
//4.建造者生产产品
worker.generateProduct();
}
}
传统的建造者模式,设计者持有建造者的引用,建造者持有产品的引用。
2.变种的建造者模式
删除了设计者和抽象的建造者类,利用产品和建造者实现。
//1.建造者
public class ProductBuilder{
//内部类用于保存需要建造的产品参数
class ProductParams{
public string window;
public string door;
}
//参数实例
private ProductParams params ;
//建造者构造方法,new一个params对象
public ProductBuilder(){
this.params = new ProductParams();
}
//建造者需要调用的方法对params进行初始化
public ProductBuilder madeWindow(String window){
params.window = window;
return this;
}
public ProductBuilder madeDoor(String door){
params.door = door;
return this;
}
public Product builder(){
Product product = new Product();
product.apply(params);
return product;
}
}
//2.产品类
public class Product{
private String window;
private String door;
public void apply(ProductParams params){
this.window = params.window;
this.door = params.door;
}
}
//3.客户端调用
public class Client{
public static void main(String[] args){
//1.创建建造者 链式调用
Builder worker = (new WorkBuilder()).madeWindow("方形窗户").madeDoor("拱形门");
//2.生产产品
Product product = worker.builder()
}
}
变种的建造者模式优点:
1.对于Product没有进行set方法,不对外部暴露改变属性的方法。
2.通过内部类保存产品的属性值,外界通过链式调用。
建造者模式,都是由建造者本身来产生具体的产品。