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实现 LeetCode 316 去除重复字母
316. 去除重复字母 给定一个仅包含小写字母的字符串,去除字符串中重复的字母,使得每个字母只出现一次.需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置). 示例 1: 输入: " ...
- Java实现蓝桥杯VIP算法训练 二元函数
试题 算法训练 二元函数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 令二元函数f(x,y)=ax+by,a和b为整数,求一个表达式S的值. 只有满足以下要求的表达式才是合法的: ...
- SQL server 常用的数据库 DDL语言
use (数据库名) //切换到目标数据库 if exists (select * from sysdatabases where name='数据库名') //如果括号里面是查看有没有这个数据库 d ...
- Java GUI 鼠标事件
import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.Mou ...
- 如何安装vue脚手架?
前提(已经安装好node,可以正常使用npm) 一.cmd输入 npm install vue-cli -g ---- 全局安装vue-cli工具 安装好过后,再输入指令 vue --version ...
- python3 驱动自动安装脚本
from pywinauto.application import Applicationimport osimport timeos.system('start C:/Users/Administr ...
- mysql基础-数据库表简单查询-记录(五)
0x01 MySQL的查询操作 单表查询:简单查询 多表查询:连续查询 联合查询 选择和投影 投影:挑选要符合的字段 select ...
- 最全的DOM事件笔记
1. DOM事件模型 DOM是微软和网景发生"浏览器大战"时期留下的产物,后来被"W3C"进行标准化,标准化一代代升级与改进,目前已经推行至第四代,即 leve ...
- 小师妹学JavaIO之:用Selector来发好人卡
目录 简介 Selector介绍 创建Selector 注册Selector到Channel中 SelectionKey selector 和 SelectionKey 总的例子 总结 简介 NIO有 ...
- MySQL ORDER BY:对查询结果进行排序
在 MySQL SELECT 语句中,ORDER BY 子句主要用来将结果集中的数据按照一定的顺序进行排序. 其语法格式为: ORDER BY {<列名> | <表达式> | ...