Java设计模式三
建造者模式
当我们思考通过复杂的零件来生成一个完整的产品时,就用到了今天要说的主题-建造者模式,下面我们实际的代码来分析建造者模式的设计
假设飞机起飞需要有多个步骤,但是每种型号的飞机起飞的步骤又不相同,这时我们想要建造一个可以起飞多种型号飞机的工程。
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设计模式三的更多相关文章
- java设计模式---三种工厂模式之间的区别
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...
- java设计模式三种工厂模式简单介绍
一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...
- java设计模式(三)--抽象工厂模式
转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...
- java设计模式---三种工厂模式
工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...
- Java设计模式(三) Visitor(訪问者)模式及多分派场景应用
基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作能够借助新的visitor实现.减少了操作间的耦合性 訪问者能够将数据结构和对数据的操作解耦,使得添加对数据结构的操作不须要 ...
- Java 设计模式(三)-单例模式(Singleton Pattern)
1 概念定义 1.1 定义 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 1.2 类型 创建类模式 1.3 难点 1)多个虚拟机 当系统中的单例类被拷贝运行在多 ...
- java设计模式(三)
单例模式在一个jvm中有且仅有一个对象(1)内部静态类实现 class Singleton{ /*构造方法私有 防止实例化*/ private Singleton(){}; public static ...
- Unity设计模式+Java设计模式,讲解+案例+PPT,一次性学会设计模式,拥抱高薪!
一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把锁的模式, ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
随机推荐
- Java实现 蓝桥杯 基础练习 闰年判断
基础练习 闰年判断 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 给定一个年份,判断这一年是不是闰年. 当以下情况之一满足时,这一年是闰年: 年份是4的倍数而不是1 ...
- Java实现 LeetCode 1013 将数组分成和相等的三个部分
1013. 将数组分成和相等的三个部分 给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false. 形式上,如果可以找出索引 i+1 < j 且满足 ...
- Java实现 蓝桥杯VIP 算法训练 校门外的树
问题描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,--,L,都种 ...
- Java中TreeSet的详细用法
第1部分 TreeSet介绍 TreeSet简介 TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet, Clonea ...
- Java实现 蓝桥杯 历届试题 危险系数
问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我们来定义一个危险系数DF( ...
- Go 语言入门教程:变量
基础使用 // base.go 注释package main // 包名import "fmt" // 导入 func main() { fmt.Println(" ...
- rpm安装Clickhouse
1. 下载相关安装包 在opt目录下创建clickhouse目录,方便下载文件 Cd /opt/clickhouse 一次执行一下命令 ① wget --content-disposition ht ...
- opencl(4)命令队列
1:创建命令队列 cl_command _queue clCreateCommandQueue( cl_context context, //上下文 cl_device_id device, ...
- CMAKE工具学习
最近在学习各大物联网平台的SDK包,发现其工程都使用了一种叫cmake的工具在管理代码.于是花了一天时间简单学习了解了cmake工具,其目的是让自己能读懂使用该工具管理的代码,并能简单使用该工具管理我 ...
- centos7上安装memcached以及PHP安装memcached扩展(一)
安装memecached 第一步:安装libevent # tar zvxf libevent-2.1.8-stable.tar.gz # cd libevent-2.1.8-stable # ./c ...