定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
具体构建者
可以想象服务员可以提供多种不同种类的原料给厨师,但是厨师拿到原料后来组件汉堡的顺序是一样的。
类型:创建类模式
类图:
四个要素
- 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
- 抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。它规范了具体生产者有哪些部分需要建造
- 建造者:具体建造产品的各个部分,最后返回一个产品。
- 导演类:不涉及产品的创建,只负责指导产品组件的创建和组装流程。
我们可以想象这样一个场景:苹果手机的生产,蓝思科技负责苹果手机各个零部件的生产,富士康负责苹果手机零部件的组装,富士康就将蓝思科技生产的苹果零部件按一定的次序组装起来。这就可以看成是构建者模式,苹果是产品,蓝思科技是具体建造者,富士康是导演类。
不过我这里将用生产汉堡的例子来说创建者模式。
汉堡有有肉,蔬菜,酱料这三部分组成(面包忽略)(产品),服务员提供上述三种原料给厨师,厨师来将这三种原料合理的搭配起来,最后服务员拿到这个刚生产的汉堡。没办法,最近汉堡吃多了,总想到汉堡。
产品类
package com.model.builder;
/**
* 将汉堡看成一个产品
* @author Administrator
*
*/
public class Hamburger {
private String sauce;//酱料
private String vegetables;//蔬菜
private String meat;//肉
public String getSauce() {
return sauce;
}
public void setSauce(String sauce) {
this.sauce = sauce;
}
public String getVegetables() {
return vegetables;
}
public void setVegetables(String vegetables) {
this.vegetables = vegetables;
}
public String getMeat() {
return meat;
}
public void setMeat(String meat) {
this.meat = meat;
}
@Override
public String toString() {
return "Hamburger [sauce=" + sauce + ", vegetables=" + vegetables
+ ", meat=" + meat + "]";
}
}
抽象构建者
package com.model.builder;
public interface Builder {
public void addSauce();
public void addVegetables();
public void addMeat();
public Hamburger getHamburger();
}
具体构建者
package com.model.builder;
/**
* 具体的建造者:服务员
* @author Administrator
*
*/
public class Serviceor implements Builder{
private Hamburger hamburger = new Hamburger();
@Override
public void addSauce() {
hamburger.setSauce("番茄酱");
}
@Override
public void addVegetables() {
hamburger.setVegetables("生菜");
}
@Override
public void addMeat() {
hamburger.setMeat("鸡肉");
}
public Hamburger getHamburger(){
return hamburger;
}
}
导演者
package com.model.builder;
/**
* 导演类:厨师
* @author Administrator
*
*/
public class Cook {
/**
* 制作汉堡的顺序
* @param duilder
*/
public void construct(Builder duilder){
duilder.addMeat();
duilder.addVegetables();
duilder.addSauce();
}
}
测试类
package com.model.builder;
public class BuilderModelMain {
public static void main(String[] args) {
Builder builder = new Serviceor();
Cook cook = new Cook();
cook.construct(builder) ;
Hamburger hamburger = builder.getHamburger();
System.out.println(hamburger.toString());
}
}
可以想象服务员可以提供多种不同种类的原料给厨师,但是厨师拿到原料后来组件汉堡的顺序是一样的。
用这样一个例子来描叙构建者我感到很苍白,总感到不就是生产一个汉堡吗?要这么负责干嘛?我觉得只有在实际中遇到适合用构建者模式的地方才能深刻体会构建者模式的好处。这个例子只是让人在大脑中有一个具体点的模型。
最近在看设计模式,希望都能看完,我会慢慢将自己看懂的实际模式用代码呈现出来,不知道何时能将这一个系列给记录完。