优点:
- 封装性
- 建造者独立,容易扩展
- 便于控制细节风险
缺点:
- 使用范围受限
- 内部复杂不适合使用
应用场景
- 相同的方法,不同的执行顺序,产生不同的事件结果时
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时
- 产品非常复杂,或者产品类中的调用顺序不同产生了不同的效能
- 在对象创建过程中会使用到系统中的一些其他的对象,这些对象在产品对象的创建过程中不易得到时
在建造者模式中,有如下四个角色:
- Product产品类
- Builder抽象建造者
- ConcreteBuilder具体建造者
- Director导演类
注意:建造者与工厂模式相似,便是建造者关注的是调用顺序,工厂关注的是具体产品
/**
* 具体产品
*
* @author Administrator
*
*/
public class Product {
/**
* 产品名称
*/
private String name;
/**
* 价格
*/
private String price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
//
// /**
// *
// * 建造者 安卓一般是写在产品内部构建
// *
// */
// public static final class Builder {
//
// /**
// * 产品名称
// */
// private String name;
// /**
// * 价格
// */
// private String price;
//
// public Builder(String name, String price) {
// // TODO Auto-generated constructor stub
// this.name = name;
// this.price = price;
// }
//
// public String getName() {
// return name;
// }
//
// public void setName(String name) {
// this.name = name;
// }
//
// public String getPrice() {
// return price;
// }
//
// public void setPrice(String price) {
// this.price = price;
// }
//
// public Product builder() {
// return new Product();
// }
// }
}
/**
* 抽象建造者
*
* @author Administrator
*
*/
public abstract class Builder {
/**
* 设置指令
*/
public abstract void setCommand();
/**
* 建造产品
*
* @return
*/
public abstract Product build();
}
/**
* 具体建造者
*
* @author Administrator
*
*/
public class ConcreteProduct extends Builder {
private Product mProduct = new Product();
@Override
public void setCommand() {
// TODO Auto-generated method stub
System.out.println("执行老大指令!");
mProduct.setName("张三");
mProduct.setPrice("100");
}
@Override
public Product build() {
// TODO Auto-generated method stub
// System.out.println("产品开始创建");
System.out.println("产品创建成功为=" + mProduct.getName() + "," + mProduct.getPrice());
return mProduct;
}
}
/**
* 导演类
*
* @author Administrator
*
*/
public class Director {
private Builder mBuilder = new ConcreteProduct();
/**
* 产品为张三的
*
* @return
*/
public Product getProduct() {
// 执行不同的命令,生成不同的产品
mBuilder.setCommand();
return mBuilder.build();
}
}
Director mDirector = new Director();
mDirector.getProduct();