先简单介绍一下问题:
现在公司要制作奔驰,宝马车辆模型,车都有启动,停止,喇叭,发动引擎这几个方法,但是这几个方法的顺序要由客户自己控制,他们想要什么顺序就什么顺序
首先简单的设计一下这个模型:
(1)在CarModel中要有一个私有的成员变量,sequeue,记录车模的执行顺序
package com.feng.creater;
import java.util.ArrayList;
public abstract class CarModel {
//各个基本方法的执行顺序
private ArrayList sequeue = new ArrayList();
protected abstract void start();
protected abstract void stop();
protected abstract void alarm();
protected abstract void engineBoom();
final public void run()
{
for(String s:sequeue)
{
if(s.equals("start"))
{
this.start();
}
else if(s.equals("stop"))
{
this.stop();
}
else if(s.equals("alarm"))
{
this.alarm();
}
else
{
this.engineBoom();
}
}
}
final public void setSequeue(ArrayList sequeue)
{
this.sequeue = sequeue;
}
}
(2)定义两个类,Benz和BMW两种车类继承CarModel类
package com.feng.creater;
public class BenzModel extends CarModel {
@Override
protected void start() {
// TODO Auto-generated method stub
System.out.println("BenzModel start...");
}
@Override
protected void stop() {
// TODO Auto-generated method stub
System.out.println("BenzModel stop...");
}
@Override
protected void alarm() {
// TODO Auto-generated method stub
System.out.println("BenzModel alarm...");
}
@Override
protected void engineBoom() {
// TODO Auto-generated method stub
System.out.println("BenzModel engineBoom...");
}
}
package com.feng.creater;
public class BMWModel extends CarModel {
@Override
protected void start() {
// TODO Auto-generated method stub
System.out.println("BMWModel start...");
}
@Override
protected void stop() {
// TODO Auto-generated method stub
System.out.println("BMWModel stop...");
}
@Override
protected void alarm() {
// TODO Auto-generated method stub
System.out.println("BMWModel alarm...");
}
@Override
protected void engineBoom() {
// TODO Auto-generated method stub
System.out.println("BMWModel engineBoom");
}
}
再看测试类:
package com.feng.creater;
import java.util.ArrayList;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
BenzModel beaz = new BenzModel();
ArrayList sequeue = new ArrayList();
sequeue.add("start");
sequeue.add("alarm");
sequeue.add("stop");
beaz.setSequeue(sequeue);
beaz.run();
}
}
但是我们一般不喜欢讲太多的类的细节暴漏给用户,用户只要告诉我们需要什么样的车就可以了,所以我们可以使用一个Bulid类来负责构造车,用户直接调用即可。
这里我们找一个导演,让导演来指挥这一系列的活动。
建造者模式当然要有建造者,每一种车的类型(这里只是区分车的类型,比如宝马,奔驰下面的小类型先不考虑)都要有一个建造者,这个地方很像工厂模式(个人感觉)
先给建造者统一一个接口
package com.feng.creater;
import java.util.ArrayList;
public abstract class CarBuilder {
public abstract void setSequeue(ArrayList sequeue);
public abstract CarModel getCarModel();
}
再为每一种车建立一个创建者类,实现上面的接口
package com.feng.creater;
import java.util.ArrayList;
public class BenzBuilder extends CarBuilder{
private BenzModel beanz= new BenzModel();
@Override
public void setSequeue(ArrayList sequeue) {
// TODO Auto-generated method stub
this.beanz.setSequeue(sequeue);
}
@Override
public CarModel getCarModel() {
// TODO Auto-generated method stub
return this.beanz;
}
}
package com.feng.creater;
import java.util.ArrayList;
public class BMWBuilder extends CarBuilder {
private BMWModel bmw = new BMWModel();
@Override
public void setSequeue(ArrayList sequeue) {
// TODO Auto-generated method stub
this.bmw.setSequeue(sequeue);
}
@Override
public CarModel getCarModel() {
// TODO Auto-generated method stub
return this.bmw;
}
}
再给导演写一个类,这个类来协调他们工作
package com.feng.creater;
import java.util.ArrayList;
public class Director {
private ArrayList sequeue = new ArrayList();
private BenzBuilder benzBuilder = new BenzBuilder();
private BMWBuilder bmwBuilder = new BMWBuilder();
//开始制造各种类型的车
//A类型的奔驰车先start-》stop
public BenzModel getABeanzModel()
{
sequeue.clear();
sequeue.add("Start");
sequeue.add("stop");
this.benzBuilder.setSequeue(sequeue);
return (BenzModel)this.benzBuilder.getCarModel();
}
//B类型的奔驰车
//先engine boom - > start->stop
public BenzModel getBBenzModel()
{
sequeue.clear();
sequeue.add("engine boom");
sequeue.add("start");
sequeue.add("stop");
this.benzBuilder.setSequeue(sequeue);
return (BenzModel)this.benzBuilder.getCarModel();
}
//A类型的宝马车
//alarm->start->stop
public BMWModel getAMWAModel()
{
sequeue.clear();
sequeue.add("alarm");
sequeue.add("start");
sequeue.add("stop");
bmwBuilder.setSequeue(sequeue);
return (BMWModel)bmwBuilder.getCarModel();
}
//B类型的宝马车
//start
public BMWModel getBMWAModel()
{
sequeue.clear();
sequeue.add("start");
bmwBuilder.setSequeue(sequeue);
return (BMWModel)bmwBuilder.getCarModel();
}
}
测试类修改如下:
package com.feng.creater;
import java.util.ArrayList;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Director director = new Director();
//现在需要一千辆A类型的奔驰车
for(int i=0; i<1000; ++i)
{
director.getABeanzModel().run();
}
//需要2000辆B类型的宝马车
for(int i=0; i<2000; ++i)
{
director.getBMWAModel().run();
}
}
}
建造者模式就是为每一种产品设计一个建造者,最后这些建造者是靠一个导演来指挥工作的。
使用的场景:
(1)相同的方法,不同的执行顺序,产生不同的结果时
(2)多个部件或者零件,都可以装配到一个对象中,但是产生的结果又不相同
(3)产品类复杂,调用顺序不同产生的结果也不同。
建造者模式关注的是零件类型和装配工艺,注重的是顺序,工厂模式关注的是生产过程,重点是创建。