今天学习了建造者模式,所谓建造者,就是将步骤一样,但是具体内容不一样的方法封装起来。我个人感觉和工厂模式有些相似之处。
首先举个例子,汽车生产的时候,不管什么汽车,组装的步骤,方式,大体上都是一样的,从这个角度来看,宝马汽车和奇瑞QQ就是一样的,他们都是汽车,区别就在于他们的用料,以及具体细节的不同,我们就用这个为例子。我不在过多的解释了,代码里有注释的。
首先看包结构
下边是具体代码:
car类,是所有汽车的抽象
package com.builder.product;
import java.util.ArrayList;
import java.util.List;
/**
* 汽车的抽象类,封装了汽车都有的一些共同特征
* @author ZHENGWEI
* @date Jul 26, 2015
*/
public abstract class Car {
private List<String> carList = new ArrayList<String>();
/**
* 最后组装汽车要用的方法
* @param str
*/
public void add(String str){
System.out.println("为汽车新增了:"+str);
carList.add(str);
}
/**
* 显示汽车由哪些零件组成
*/
public void show(){
for(String str : this.carList){
System.out.println(str);
}
}
}
之后是具体的那个汽车
package com.builder.product;
public class BMW extends Car{
private String str = "增加了宝马特有的安全刹车系统";
public BMW(){
super();
super.add(this.str);
}
}
package com.builder.product;
public class QQ extends Car{
//这个就不要在意QQ有没有这个东西了,只是个例子
private String str = "奇瑞QQ特有的安全刹车系统";
public QQ(){
super();
super.add(this.str);
}
}
下面是建造者了,先定义接口
package com.builder.builder;
import com.builder.product.Car;
/**
* 建造者的接口,不管生产什么样子的汽车,这几个步骤是一定要有的
* @author ZHENGWEI
* @date Jul 26, 2015
*/
public interface IBuilder {
/**
* 增加发动机,每个汽车都需要发动机
*/
public void addMotor();
/**
* 增加方向盘
*/
public void addSteering();
/**
* 增加车轮
*/
public void addTyre();
/**
* 返回car的实例
* @return
*/
public Car getCar();
//还有许多零件,这里就不一一列举了。。。
}
然后是两个具体实现类
package com.builder.builder;
import com.builder.product.BMW;
import com.builder.product.Car;
/**
* 宝马的建造者
* @author ZHENGWEI
* @date Jul 26, 2015
*/
public class BMWBulider implements IBuilder {
private BMW bmw = new BMW();
public void addMotor() {
bmw.add("宝马V8发动机,排量4.0");
}
public void addSteering() {
bmw.add("宝马电动助力方向盘");
}
public void addTyre() {
bmw.add("米其林轮胎,宝马专用版");
}
public Car getCar() {
return bmw;
}
}
package com.builder.builder;
import com.builder.product.Car;
import com.builder.product.QQ;
/**
* QQ的建造者
* @author ZHENGWEI
* @date Jul 26, 2015
*/
public class QQBuilder implements IBuilder {
private QQ qq = new QQ();
public void addMotor() {
qq.add("奇瑞QQ普通发动机,排量1.0");
}
public void addSteering() {
qq.add("奇瑞QQ普通无助力方向盘");
}
public void addTyre() {
qq.add("奇瑞QQ普通轮胎");
}
public Car getCar() {
return qq;
}
}
之后比较重要的就是导演类了,这个类负责全局的调用和指挥建造者
package com.builder.director;
import com.builder.builder.IBuilder;
public class Director {
private IBuilder builder;
/**
* 构造方法,传入该接口的实现,即具体的某个生产者
* @param builder
*/
public Director(IBuilder builder){
this.builder = builder;
}
/**
* 开始组装,这里,每个汽车的组装方式,组装顺序都是一样的
*/
public void startAdd(){
this.builder.addMotor();
this.builder.addSteering();
this.builder.addTyre();
}
}
最后来一个测试类
package com.builder.main;
import com.builder.builder.BMWBulider;
import com.builder.builder.IBuilder;
import com.builder.builder.QQBuilder;
import com.builder.director.Director;
import com.builder.product.Car;
public class BuilderMain {
public static void main(String[] args) {
IBuilder bmwBuil = new BMWBulider();
//宝马
Director director = new Director(bmwBuil);
director.startAdd();
Car bmwCar = bmwBuil.getCar();
bmwCar.show();
IBuilder qqBuil = new QQBuilder();
//QQ
Director director1 = new Director(qqBuil);
director.startAdd();
Car qqCar = bmwBuil.getCar();
qqCar.show();
}
}
最后是结果
原则上来说,这个模式就是封装了不变的,区别的变化的,将变与不变分开,使结构更清晰。