建造者模式
前言
- 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
- 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。
建造者模式
1.产品角色
/**
* 汽车产品
*/
public class Car {
//车头
private String head;
//车身
private String body;
//车尾
private String tail;
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getTail() {
return tail;
}
public void setTail(String tail) {
this.tail = tail;
}
}
2.抽象建造者
/**
* 汽车建造
*/
public abstract class CarBuilder {
//组装车头
public abstract void makeHead();
//组装车身
public abstract void makeBody();
//组装车尾
public abstract void makeTail();
public abstract Car getCar();
}
3.具体建造者
/**
* 吉普车建造
*/
public class JeepBuilder extends CarBuilder{
Car car = new Car();
@Override
public void makeHead() {
System.out.println("Jeep Head");
}
@Override
public void makeBody() {
System.out.println("Jeep Body");
}
@Override
public void makeTail() {
System.out.println("Jeep Tail");
}
@Override
public Car getCar() {
return car;
}
}
4.指挥者
/**
* 汽车组装操作
*/
public class CarDirector {
//汽车组装操作
public void makeCar(CarBuilder carBuilder){
//组装车头
carBuilder.makeHead();
//组装车身
carBuilder.makeBody();
//组装车尾
carBuilder.makeTail();
}
}
5.具体实现
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
CarDirector director = new CarDirector();
//创建吉普车工厂
CarBuilder builder = new JeepBuilder();
//调用CarDirector组装汽车
director.makeCar(builder);
//得到组装好的汽车
Car car = builder.getCar();
}
}
该处使用的url网络请求的数据。
应用场景
- StringBuilder类的append方法
- SQL中的PreparedStatement
- JDOM中,DomBuilder、SAXBuilder
总结
- 与工厂模式的区别:工厂模式往往只关心你要的是什么,不关系具体的细节;而建造者模式则关心的是这个东西具体细节的创建。
- 建造者模式的优点:封装性、建造者独立,容易拓展、便于控制细节风险
- 使用场景:
(1)相同方法,不同的执行顺序,产生不同的结果
(2)多个部件和零件,都可以装配到同一对象,运行结果还不同
(3)产品类非常复杂,或产品类中的调用顺序不同产生不同的效能