建造者模式

当我们思考通过复杂的零件来生成一个完整的产品时,就用到了今天要说的主题-建造者模式,下面我们实际的代码来分析建造者模式的设计

假设飞机起飞需要有多个步骤,但是每种型号的飞机起飞的步骤又不相同,这时我们想要建造一个可以起飞多种型号飞机的工程。

1.首先我们先预先定义一个抽象的飞机起飞类,此类中包含启动发动机、轮滑、推力式发射、弹射、起飞等操作。


public abstract class Airplane {
//定义每个步骤的执行顺序
private ArrayList<String> sequence = new ArrayList<>();
//飞机打开发动机
protected abstract void start();
//飞机滑行
protected abstract void glide();
//飞机被推力发射
protected abstract void emit();
//飞机弹射
protected abstract void popup();
//开始起飞
protected abstract void hopoff();
//设定传递方法
final public void setSequence(ArrayList<String> sequence) {
this.sequence = sequence;
}
//飞机起飞步骤
final public void run() {
for(int i = 0;i<this.sequence.size();i++) {
String actionName = this.sequence.get(i);
if(actionName.equalsIgnoreCase("start")) {
this.start();
}else if(actionName.equalsIgnoreCase("glide")) {
this.glide();
}else if(actionName.equalsIgnoreCase("emit")) {
this.emit();
}else if(actionName.equalsIgnoreCase("popup")) {
this.popup();
}else if(actionName.equalsIgnoreCase("hopoff")) {
this.hopoff();
}
}
} } class J10 extends Airplane{ @Override
protected void start() {
// TODO Auto-generated method stub
System.out.println("J10启动发动机");
} @Override
protected void glide() {
// TODO Auto-generated method stub
System.out.println("J10开始滑行"); } @Override
protected void emit() {
// TODO Auto-generated method stub
System.out.println("J10被发射");
} @Override
protected void popup() {
// TODO Auto-generated method stub
System.out.println("J10被弹射");
} @Override
protected void hopoff() {
// TODO Auto-generated method stub
System.out.println("J10成功起飞");
} } class J15 extends Airplane{
@Override
protected void start() {
// TODO Auto-generated method stub
System.out.println("J15启动发动机");
} @Override
protected void glide() {
// TODO Auto-generated method stub
System.out.println("J15开始滑行"); } @Override
protected void emit() {
// TODO Auto-generated method stub
System.out.println("J15被发射");
} @Override
protected void popup() {
// TODO Auto-generated method stub
System.out.println("J15被弹射");
} @Override
protected void hopoff() {
// TODO Auto-generated method stub
System.out.println("J15成功起飞");
}
}

2.定义建造类-定义每种类型飞机的起飞步骤


/**
* 飞机组装类
*
*/
public abstract class AirBuilder { public abstract void setSequence(ArrayList<String> sequence);
//设置飞机的不同型号
public abstract Airplane getAirplane();
} class J10Builder extends AirBuilder{
private J10 j10 = new J10(); @Override
public void setSequence(ArrayList<String> sequence) {
// TODO Auto-generated method stub
this.j10.setSequence(sequence);
} @Override
public Airplane getAirplane() {
// TODO Auto-generated method stub
return this.j10;
} } class J15Builder extends AirBuilder{
private J15 j15 = new J15(); @Override
public void setSequence(ArrayList<String> sequence) {
// TODO Auto-generated method stub
this.j15.setSequence(sequence);
} @Override
public Airplane getAirplane() {
// TODO Auto-generated method stub
return this.j15;
} }

3.开始起飞测试


/**
* 飞行测试
*
*/
public class Client { public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<String> sequence1 = new ArrayList<>();
sequence1.add("start");//设置J10开始发动
sequence1.add("glide");//开始滑行
sequence1.add("hopoff");//成功起飞
ArrayList<String> sequence2 = new ArrayList<>();
sequence2.add("start");//设置J150开始发动
sequence2.add("emit");//开始弹射
sequence2.add("hopoff");//成功起飞
//实例化一架J10
J10Builder j10builder = new J10Builder();
j10builder.setSequence(sequence1);
J10 j10 = (J10) j10builder.getAirplane();
j10.run();
System.out.println();
J15Builder j15Builder = new J15Builder();
j15Builder.setSequence(sequence2);
J15 j15 = (J15) j15Builder.getAirplane();
j15.run();
} }

运行结果:

批量建造

/**
* 飞机场-定义每种型号飞机的具体起飞方法
*/
public class AirPort {
private ArrayList<String> sequence = new ArrayList<>();//定义起飞步骤顺序
private J10Builder j10builder = new J10Builder();
private J15Builder j15builder = new J15Builder();
/**
* 定义J10起飞步骤
* @return J10
*/
public J10 getJ10model() {
this.sequence.clear();
sequence.add("start");//设置J10开始发动
sequence.add("glide");//开始滑行
sequence.add("hopoff");//成功起飞 this.j10builder.setSequence(sequence);
return (J10)this.j10builder.getAirplane();
}
/**
* 定义J150起飞步骤
* @return J15
*/
public J15 getJ15model() {
this.sequence.clear();
sequence.add("start");//设置J15开始发动
sequence.add("emit");//弹射
sequence.add("hopoff");//成功起飞 this.j15builder.setSequence(sequence);
return (J15)this.j15builder.getAirplane();
} }

定义测试类


public class NewClient {
public static void main(String[] args) {
AirPort airport = new AirPort();
for (int i = 0; i<=20; i++) {
System.out.println("第"+i+"架J10开始起飞");
airport.getJ10model().run();
}
for (int i = 0; i<=30; i++) {
System.out.println("第"+i+"架J15开始起飞");
airport.getJ15model().run();
}
} }

运行结果:

以上代码可以细细品味这样设计的好处,建造者模式便于我们控制细节,并且使得程序容易扩展。

Java设计模式三的更多相关文章

  1. java设计模式---三种工厂模式之间的区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  2. java设计模式三种工厂模式简单介绍

    一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...

  3. java设计模式(三)--抽象工厂模式

    转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...

  4. java设计模式---三种工厂模式

    工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...

  5. Java设计模式(三) Visitor(訪问者)模式及多分派场景应用

    基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作能够借助新的visitor实现.减少了操作间的耦合性 訪问者能够将数据结构和对数据的操作解耦,使得添加对数据结构的操作不须要 ...

  6. Java 设计模式(三)-单例模式(Singleton Pattern)

    1     概念定义 1.1   定义 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 1.2   类型 创建类模式 1.3   难点 1)多个虚拟机 当系统中的单例类被拷贝运行在多 ...

  7. java设计模式(三)

    单例模式在一个jvm中有且仅有一个对象(1)内部静态类实现 class Singleton{ /*构造方法私有 防止实例化*/ private Singleton(){}; public static ...

  8. Unity设计模式+Java设计模式,讲解+案例+PPT,一次性学会设计模式,拥抱高薪!

    一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把锁的模式, ...

  9. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

随机推荐

  1. Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)

    804. 唯一摩尔斯密码词 国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: "a" 对应 ".-", " ...

  2. Java实现 LeetCode 399 除法求值

    399. 除法求值 给出方程式 A / B = k, 其中 A 和 B 均为代表字符串的变量, k 是一个浮点型数字.根据已知方程式求解问题,并返回计算结果.如果结果不存在,则返回 -1.0. 示例 ...

  3. Java实现 LeetCode 49 字母异位词分组

    49. 字母异位词分组 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", & ...

  4. Java实现 LeetCode 7整数反转

    7. 整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: ...

  5. SQL Server账号密码(sa)登录失败 错误原因:233

    (其实以前经常用的时候,都很简单,最近一段时间不用了,再一看发现都忘记的差不多了,还是写一篇博客吧,防止下一次再在这种问题上面浪费时间) 右键此电脑,点击管理 如果没有此电脑打开文件夹 在这里右键也是 ...

  6. Android中StateListDrawable的种类(状态的种类)

    <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="ht ...

  7. java关键字final用法详解

    final关键字在java中也是属于比较常用的一种,因此也算得上是一个比较重要的关键字,有必要对它进行深入的学习. 一.定义:用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成 ...

  8. 恕我直言,我怀疑你并不会用 Java 枚举

    开门见山地说吧,enum(枚举)是 Java 1.5 时引入的关键字,它表示一种特殊类型的类,默认继承自 java.lang.Enum. 为了证明这一点,我们来新建一个枚举 PlayerType: p ...

  9. v-model 指令来实现双向数据绑定

    <div id="app"> <p>{{ message }}</p> <input v-model="message" ...

  10. Git中的core.autocrlf选项

    项目的开发环境为Windows,在Linux环境下编译,使用Git进行版本控制. 在安装好Git和TortoiseGit后,从远端clone,遇到一个奇怪的问题,Shell脚本中的LF总是被替换成了C ...