建造者模式
建造者模式属于设计模式中的构造性模式,也就是说该模式基本上是用在构建对象的时候。它的宗旨就是将一个复杂的事物,进行一步一步的构建,需要什么就拼接成什么。
UML
类图如下:
Derictor: 指挥人,哔哩吧啦说你这玩意儿要怎么建
builder:抽象建造者,怎么建的一系列方法
concreteBuilder:具体的劳动力,实现建造的方法
product:具体的产品类
源码分析
给大家讲一个生动形象的例子,小刚喜欢大宝剑,没事就去洗洗脚按按摩。从这句话里面,我们就可以分析出一个模式。 大宝剑:具体的产品 小刚:享受服务的指挥人,要什么服务都由他决定 老板:大宝剑服务的建造者
传统模式下,小刚要一个大大宝剑服务是不是说:老板,做个大宝剑(new dabaojian())服务就出来了。但是存在一个问题,这样叫出来的是个大大宝剑,但是 具体哪一些服务没有指定,老板肯定问你:都想做什么服务;那服务种类很多,不可能每次都是
new Dabaojian("洗脚");
new Dabaojian("洗脚","按摩");
new Dabaojian("洗脚","按摩","打扑克");
服务千姿百态这样就会存在弊端。老板也想到这个问题了 所以老板就会拼接各种服务给客人做成一个大宝剑 具体见代码分析
public class Bighealthcare {
private String xijiao;
private String anmo;
private String dapuke;
/**
* 传统享受大宝剑服务就洗洗脚
* @param xijiao
*/
public Bighealthcare(String xijiao){
this.xijiao = xijiao;
}
/**
* 舒服一点就加个按摩
* @param xijiao
*/
public Bighealthcare(String xijiao,String anmo){
this.xijiao = xijiao;
this.anmo = anmo;
}
/**
* 想更舒服就搞个扑克打一下
* @param xijiao
* @param anmo
* @param dapuke
*/
public Bighealthcare(String xijiao,String anmo,String dapuke){
this.xijiao = xijiao;
this.anmo = anmo;
this.dapuke = dapuke;
}
/**
* 建造者模式的大宝剑服务
*/
public Bighealthcare(Builder builder){
this.xijiao = builder.xijiao;
this.anmo = builder.anmo;
this.dapuke = builder.dapuke;
}
protected static class Builder{
protected String xijiao;
protected String anmo;
protected String dapuke;
protected Builder xijiao(String xijiao){
this.xijiao = xijiao;
return this;
}
protected Builder anmo(String anmo){
this.anmo = anmo;
return this;
}
protected Builder dapuke(String dapuke){
this.dapuke = dapuke;
return this;
}
protected Bighealthcare build(){
return new Bighealthcare(this);
}
}
public void service(){
System.out.print(this.toString());
}
小刚要做大宝剑了
public class Test {
public static void main(String args[]){
//传统模式下的大宝剑服务
Bighealthcare tradition = new Bighealthcare("洗个脚","按个摩","打扑克");
tradition.service();
//建造器模式下的大宝剑服务,先构造一个大宝剑服务,具体要哪些项目可以一个个拼装,扩展方便
//运用《effective java》中说的,当构造方法过多时就应该要考虑使用构造器,其实就是建造者模式
//简单大宝剑
Bighealthcare simpleBighealthcare = new Bighealthcare.Builder().xijiao("洗个脚").build();
simpleBighealthcare.service();
//一般大宝剑
Bighealthcare generalBighealthcare = new Bighealthcare.Builder().xijiao("洗个脚").anmo("按个摩").build();
generalBighealthcare.service();
//高级大宝剑
Bighealthcare specialBighealthcare = new Bighealthcare.Builder().xijiao("洗个脚").anmo("按个摩").dapuke("打扑克").build();
specialBighealthcare.service();
}
}