设计模式之建造者模式

建造者模式

1、已车辆模型为例,客户要求,车辆要求先启动、再鸣笛、再停止。

分析:需要有个抽象车模吧,还要有具体车辆的实现类吧。编写测试类就能完成这一需求

package gov.mof.fasp2.gcfr.adjustoffset.adjust;

import java.util.ArrayList;

/**
 * 车模抽象类
 * @author haokui
 *
 */
abstract class CarModel {
    //存放执行顺序
    private ArrayList<String> seq = new ArrayList<String>();
     //启动
    abstract void start();
    
    //停止
    abstract void stop();
    
    //鸣笛
    abstract void alarm();
    void run() {
        for (String str : seq) {
            if ("start".equals(str)) {
                this.start();
                continue;
            }
            if ("stop".equals(str)) {
                this.stop();
                continue;
            }
            if ("alarm".equals(str)) {
                this.alarm();
                continue;
            }
        }
    }
    //设置顺序
    public void setSeq(ArrayList<String> seq) {
        this.seq = seq;
    }
}
/**
 * 奔驰模型
 * @author haokui
 *
 */
class BenzModel extends CarModel{

    @Override
    void start() {
        System.out.println("奔驰启动。。。");
    }

    @Override
    void stop() {
        System.out.println("奔驰停止。。。");
        
    }

    @Override
    void alarm() {
        System.out.println("奔驰鸣笛。。。");
        
    }
    
}
/**
 * 宝马模型
 * @author haokui
 *
 */
class BMWModel extends CarModel{

    @Override
    void start() {
        System.out.println("宝马启动。。。");
    }

    @Override
    void stop() {
        System.out.println("宝马停止。。。");
        
    }

    @Override
    void alarm() {
        System.out.println("宝马鸣笛。。。");
        
    }
}
/**
 * 测试场景类
 * @author haokui
 *
 */
public  class Main {
    public static void main(String[] args) {
        BMWModel bmw = new BMWModel();
         ArrayList<String> seq = new ArrayList<String>();
         seq.add("start");
         seq.add("alarm");
         seq.add("stop");
         bmw.setSeq(seq);
         bmw.run();
    }
}

运行结果:

宝马启动。。。
宝马鸣笛。。。
宝马停止。。。

 

2、刚把这个写完,客户又说了,不想要这样的了,要求可以自己设置顺序,不一定是刚才的顺序。完了,傻脸了。得想办法满足客户需求啊,所以下面就是要用建造者模式去满足客户的需求。

分析:抽象车模还是要有。但是给车辆模型建一个抽象建造者,宝马和奔驰各自编写一个建造者来实现车模建造者,他的作用就是设置宝马或者奔驰传递过来的顺序,和返回一个具体的车辆模型。

package gov.mof.fasp2.gcfr.adjustoffset.adjust;

import java.util.ArrayList;

/**
 * 车模抽象类
 * @author haokui
 *
 */
abstract class CarModel {
    //存放执行顺序
    private ArrayList<String> seq = new ArrayList<String>();
     //启动
    abstract void start();
    
    //停止
    abstract void stop();
    
    //鸣笛
    abstract void alarm();
    void run() {
        for (String str : seq) {
            if ("start".equals(str)) {
                this.start();
                continue;
            }
            if ("stop".equals(str)) {
                this.stop();
                continue;
            }
            if ("alarm".equals(str)) {
                this.alarm();
                continue;
            }
        }
    }
    //设置顺序
    public void setSeq(ArrayList<String> seq) {
        this.seq = seq;
    }
}
/**
 * 奔驰模型
 * @author haokui
 *
 */
class BenzModel extends CarModel{

    @Override
    void start() {
        System.out.println("奔驰启动。。。");
    }

    @Override
    void stop() {
        System.out.println("奔驰停止。。。");
        
    }

    @Override
    void alarm() {
        System.out.println("奔驰鸣笛。。。");
        
    }
    
}
/**
 * 宝马模型
 * @author haokui
 *
 */
class BMWModel extends CarModel{

    @Override
    void start() {
        System.out.println("宝马启动。。。");
    }

    @Override
    void stop() {
        System.out.println("宝马停止。。。");
        
    }

    @Override
    void alarm() {
        System.out.println("宝马鸣笛。。。");
        
    }
}
/**
 * 车辆模型建造者
 * @author haokui
 *
 */
abstract class  CarBuild   {
    
    //返回车模
    public abstract CarModel getCarModel();
    
    //设置传递过来的顺序
    public abstract void setSeq(ArrayList<String> seq);
    
}
/**
 * 奔驰模型建造者
 * @author haokui
 *
 */
  class BenzBuild extends CarBuild {
    BenzModel b = new BenzModel();
    @Override
    public CarModel getCarModel() {
        return b;
    }

    @Override
    public void setSeq(ArrayList<String> seq) {
        this.b.setSeq(seq);
    }
    
}
/**
 * 宝马模型建造者
 * @author haokui
 *
 */
 class BMWBuild extends CarBuild {
    
     BMWModel b = new BMWModel();
    @Override
    public CarModel getCarModel() {
        return b;
    }

    @Override
    public void setSeq(ArrayList<String> seq) {
        this.b.setSeq(seq);
    }
    
}

/**
 * 测试场景类
 * @author haokui
 *
 */
public  class Main {
    public static void main(String[] args) {
        //定义一个顺序
         ArrayList<String> seq = new ArrayList<String>();
         seq.add("start");
         seq.add("alarm");
         seq.add("stop");
         
         //创建奔驰建造者
         BenzBuild b = new BenzBuild();
         b.setSeq(seq);
         BenzModel benz = (BenzModel) b.getCarModel();
         benz.run();
         
         //按照同样的顺序,再要一个宝马
         BMWBuild bmw = new BMWBuild();
         bmw.setSeq(seq);
         BMWModel bmwmodel = (BMWModel) bmw.getCarModel();
         bmwmodel.run();
    }
}

运行结果:

奔驰启动。。。
奔驰鸣笛。。。
奔驰停止。。。
宝马启动。。。
宝马鸣笛。。。
宝马停止。。。

 

同理,再要一个奥迪也是一样,这样的话就不要直接去访问产品类了,直接把顺序传递给建造者,然后获取车模,拿到模型,再去运行,代码会简便很多。

 

posted @ 2018-05-28 17:21  土豆Z120553  阅读(246)  评论(0编辑  收藏  举报