建造者模式

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

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

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. 判断IP地址的合法性

    每台计算机都有独一无二的编号,称为ip地址,每个合法的ip地址由‘.’分隔开的4个数字组成,每个数字的取值范围为0--255 输入一个字符串,判断其是否为合法的IP地址,若是输出‘YES’,否则输出‘ ...

  2. Java实现 LeetCode 318 最大单词长度乘积

    318. 最大单词长度乘积 给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母.你可以认为每个单词只包含小 ...

  3. Java实现 蓝桥杯VIP 算法训练 数列

    问题描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,- (该序列实际上就是 ...

  4. Linux 工作管理

    把进程放入后台 进程后加&,这时,进程在后台是运行的 tar -zcf etc.tar.gz /etc & 在执行程序时,快速按下ctrl+z快捷键,这时,进程在后台是停止的 查看后台 ...

  5. 从零搭建Window前端开发环境

    前言 作为一个小前端,是否因为搭建环境烦恼过,是否因为npm等国外镜像踩坑过,不要怕,接下来跟着我一步步搭建适合自己的开发环境吧!!! node 这个不用说了吧,我们经常和他打交道,无论是 gulp. ...

  6. pc端网站如何自动跳转到移动wap端网站

    <script type="text/javascript"> var uaTest = /Android|webOS|Windows Phone|iPhone|ucw ...

  7. Mini2440上的第一个程序——点亮Led

    手头的Mini2440搁置了两年半之后,我再次决定拿出它,重新尝试嵌入式Linux的学习. 我使用的是友善之臂的Mini2440开发板.韦东山的<嵌入式Linux应用开发完成手册>及其视频 ...

  8. Linux中GitLab的部署

    1.版本控制介绍 ​ 版本控制最主要的功能就是追踪文件的变更.它将什么时候.什么人更改了文件的什么内容等信息忠实地了记录下来.每一次文件的改变,文件的版本号都将增加.除了记录版本变更外,版本控制的另一 ...

  9. Java——String类(常用类)

    一.String类——描述字符串 常用的方法简单介绍: 1.charAt() 获取对应位置的字符 2.length() 获取字符串的长度 3.concat() 在字符串的尾部追加内容-----相当于连 ...

  10. 不知道这些,你以为你还能devops?

    一.什么是devops 在DevOps之前,从业人员使用瀑布模型或敏捷开发模型进行软件项目开发:瀑布模型或顺序模型是软件开发生命周期(SDLC)中的一种开创性方法,在这个模型中,软件开发成为一个线性过 ...