博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
构造者模式
阅读量:5049 次
发布时间:2019-06-12

本文共 4566 字,大约阅读时间需要 15 分钟。

一 适用场景产品类非常复杂或者产品类中的调用顺序不同产生不同的结果。比如说,现在有个场景:客户公司让我们按一定的条件生产汽车模型,这个条件是,这些汽车模型可以按照用户自己给定的任意操作顺序来运行,针对这个问题该怎么解决呢?

二 实现方式:

创建产品抽象类CarModel:

/** * @author chenyk * @date 2018年9月6日 * 产品抽象类 */public abstract class CarModel {        // 各个基本方法的执行顺序就定义在这个集合中    private List
sequence = new ArrayList
(); // 开始启动 public abstract void start(); //停止 public abstract void stop(); // 喇叭声音 public abstract void alarm(); // 引擎启动声音 public abstract void engineBoom(); // 根据定义好的顺序决定哪个先执行 public void run(){ for(int i=0;i
sequence){ this.sequence = sequence; } }

创建产品类BenzModel和BMWModel:

/**  * @author chenyk * @date 2018年9月6日 * 具体产品类 */public class BenzModel extends CarModel{    @Override    public void start() {        System.out.println("奔驰开始启动");    }    @Override    public void stop() {        System.out.println("奔驰停止");    }    @Override    public void alarm() {        System.out.println("奔驰的喇叭声音");    }    @Override    public void engineBoom() {        System.out.println("奔驰的引擎启动声音");    }}
/**  * @author chenyk * @date 2018年9月6日 * 具体产品类 */public class BMWModel extends CarModel{    @Override    public void start() {        System.out.println("宝马开始启动");    }    @Override    public void stop() {        System.out.println("宝马停止");    }    @Override    public void alarm() {        System.out.println("宝马的喇叭声音");    }    @Override    public void engineBoom() {        System.out.println("宝马的引擎启动声音");    }}

创建构造者抽象类

public abstract class CarBuilder {        public abstract void setSequence(ArrayList
sequence); public abstract CarModel getCarModel(); }

创建构造者具体类

public class BenzBuilder extends CarBuilder{    private BenzModel benzModel = new BenzModel();        @Override    public void setSequence(ArrayList
sequence) { this.benzModel.setSequence(sequence); } @Override public CarModel getCarModel() { return this.benzModel; }}
public class BMWBuilder extends CarBuilder{    private BMWModel bmw = new BMWModel();        @Override    public void setSequence(ArrayList
sequence) { this.bmw.setSequence(sequence); } @Override public CarModel getCarModel() { return this.bmw; }}

创建导演类:

/** * @author chenyk * @date 2018年9月6日 * 导演类 */public class Director {        private ArrayList
sequence = new ArrayList
(); private BenzBuilder benzBuilder = new BenzBuilder(); private BMWBuilder bmwBuilder = new BMWBuilder(); /** * A类型奔驰模型:start----》stop * @return */ public BenzModel getABenzModel(){ this.sequence.clear(); this.sequence.add("start"); this.sequence.add("stop"); this.benzBuilder.setSequence(this.sequence); return (BenzModel) this.benzBuilder.getCarModel(); } /** * B类型奔驰模型:start---》engineBoom---》stop * @return */ public BenzModel getBBenzModel(){ this.sequence.clear(); this.sequence.add("start"); this.sequence.add("engineBoom"); this.sequence.add("stop"); this.benzBuilder.setSequence(this.sequence); return (BenzModel) this.benzBuilder.getCarModel(); } /** * C类型宝马模型:start---》alarm * @return */ public BMWModel getCBMWModel(){ this.sequence.clear(); this.sequence.add("start"); this.sequence.add("alarm"); this.bmwBuilder.setSequence(this.sequence); return (BMWModel) this.bmwBuilder.getCarModel(); } /** * D类型宝马模型:start---》stop * @return */ public BMWModel getDBMWModel(){ this.sequence.clear(); this.sequence.add("start"); this.sequence.add("stop"); this.bmwBuilder.setSequence(this.sequence); return (BMWModel) this.bmwBuilder.getCarModel(); } }

创建场景类Client:

public class Client {    public static void main(String[] args) {        Director director = new Director();                //10辆A类型奔弛        for(int i=0;i<10;i++){            director.getABenzModel().run();        }                //10辆D类型宝马        for (int i = 0; i < 10; i++) {            director.getDBMWModel().run();        }            }}

总结:对于构造者模式,有这几个角色:

导演类Director,负责安排运行顺序,然后告诉构造者开始建造。

建造者 CarBuilder和BMWBuilder,BenzBuilder,按照指定的顺序建造奔弛和宝马的车模型。

产品类 CarModel和BenzModel,BMWModel,就是建造者生产出的车模型,具体的产品。

通过这三个角色,我们可以建造出不同车型各种运行顺序的车模型,可以按照想要的顺序进行各种组合,这就是构造者模型的最大特点。

 

参考资料:《设计模式之禅》

转载于:https://www.cnblogs.com/51life/p/9598723.html

你可能感兴趣的文章
Vue-详解设置路由导航的两种方法
查看>>
一个mysql主从复制的配置案例
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
dvwa网络渗透测试环境的搭建
查看>>
Win8 安装VS2012 和 Sql Server失败问题
查看>>
过点(2,4)作一直线在第一象限与两轴围成三角形,问三角形面积的最小值?...
查看>>
java aes CBC的填充方式发现
查看>>
使用ionic cordova build android --release --prod命令打包报有如下错误及解决方法
查看>>
BZOJ 2338 HNOI2011 数矩形 计算几何
查看>>
关于页面<!DOCTYPE>声明
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>
C++标准库vector使用(更新中...)
查看>>
cocos2d-x 2.2.6 之 .xml文件数据读取
查看>>
枚举的使用
查看>>
BZOJ 1531 二进制优化多重背包
查看>>
BZOJ 2324 (有上下界的)费用流
查看>>
python3基础06(随机数的使用)
查看>>
Zookeeper系列(二)特征及应用场景
查看>>
【HTTP】Fiddler(三)- Fiddler命令行和HTTP断点调试
查看>>
Spring Boot使用Druid和监控配置
查看>>