用到的设计模式总结--单例模式+工厂方法模式+Builder模式
一,工厂方法模式和单例模式
工厂方法模式中有一个抽象的工厂接口和一个抽象的产品接口。然后,具体的工厂实现抽象工厂并负责生产具体的产品。由客户端决定 new 哪个具体的工厂,从而生产哪种产品。
因此,与简单工厂模式相比,工厂方法将产品的选择判断交给了客户端。而简单工厂则是通过客户端传过来的生产哪种产品的类型通过 switch-case 在简单工厂中判断要生产哪种产品。
比如,对于Job而言,有编译作业和普通用户作业,如下:
aaarticlea/png;base64,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" alt="" width="763" height="300" />
此外,工厂采用单例模式来实现。即只有一个具体的工厂实例。
public class CompileJobFactory implements JobFactory { //prevents instantiation
private CompileJobFactory() { } private static volatile CompileJobFactory compileJobFactory; public static CompileJobFactory createInstance(){
if(compileJobFactory == null){
synchronized (CompileJobFactory.class) {
if(compileJobFactory == null)
compileJobFactory = new CompileJobFactory();
}
}
return compileJobFactory;
}
//other method
}
注意:第8行的 volatile关键字。这样可以避免内存的”乱序写入“导致创建多个实例的情形。尽管已经使用了synchronized,但是还得用 volatile修饰单例引用。参考
所谓”乱序写入“,在这里就是:先将 compileFactory 变量赋值,然后再创建对象。(正常顺序是先创建好CompileFactory对象后,再将 compileFactory指向该对象)
这样,在客户端,可以这样来使用工厂模式:可以看出,由客户端判断 创建哪种类型的工厂,进而创建何种类型的产品。
if(type.equals("0")){
jobFactory = CompileJobFactory.createInstance();
job = jobFactory.createJob(jsonStr);
}else if(type.equals("1")){
jobFactory = CommonJobFactory.createInstance();
job = jobFactory.createJob(jsonStr);
}
二,构造者(Builder)模式
对于每个Job都有一份 作业配置对象 与之对应。而生成每种作业的配置流程都是一样的:包括三部分:版本配置、集群配置、和自定义配置。因此,可以用一个抽象类Builder定义好整个创建流程,再用Director类负责指挥创建哪种作业的配置。
aaarticlea/png;base64,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" alt="" width="693" height="324" />
public class JobConfigDirector { private JobConfigBuilder jobConfig; public JobConfigDirector(JobConfigBuilder jobConfig) {
this.jobConfig = jobConfig;
} public String createJobConfig() {
return jobConfig.versionConfig().append(jobConfig.clusterConfig())
.append(jobConfig.customeConfig()).toString();
}
}
JobConfigDirector director = new JobConfigDirector(new CommonJobBuilder(appPath));
String jobConfig = director.createJobConfig();
在客户端,把CommonJobBuilder对象传递给JobConfigDirector,告诉它去创建 某种作业配置类型就可以了。
用到的设计模式总结--单例模式+工厂方法模式+Builder模式的更多相关文章
- java设计模式-----2、工厂方法模式
再看工厂方法模式之前先看看简单工厂模式 工厂方法模式(FACTORY METHOD)同样属于一种常用的对象创建型设计模式,又称为多态工厂模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的 ...
- [设计模式]<<设计模式之禅>>工厂方法模式
1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹 ...
- 大话设计模式C++版——工厂方法模式
工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版——简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主 ...
- IOS设计模式浅析之工厂方法模式(Factory Method)
概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...
- PHP设计模式一:工厂方法设计模式
一.什么是工厂方法模式 作为一种创建型设计模式,工厂方法模式就是要创建“某种东西”.对于工厂方法,要创建的“东西”是一个产品,这个产品与创建它的类之间不存在绑定. 实际上,为了保持这种松耦合,客户会通 ...
- [C#]设计模式-工厂方法-创建型模式
介绍完简单工厂之后,现在就来介绍一下工厂方法模式.之前简单工厂有一个弊端就是每次你需要产生新的产品的时候都需要对创建工厂类进行更改,如同前一篇文章说过的一样最后的后果是工厂类会变得十分庞大. 而工厂方 ...
- C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】
一.引言 在上一篇文章中我们讲解了过渡的一种模式叫做[简单工厂],也有叫[静态工厂]的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化 ...
- 设计模式C++实现——工厂方法模式
模式定义: 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 模式结构: Creator是一个类,它实现了全部操纵产品的方法,但不实现工厂方法 ...
- PHP设计模式之 单例模式 工厂模式 实例讲解
单例模式又称为职责模式,它用来在程序中创建一个单一功能的访问点,通俗地说就是实例化出来的对象是唯一的.所有的单例模式至少拥有以下三种公共元素:1. 它们必须拥有一个构造函数,并且必须被标记为priva ...
随机推荐
- Mysql基础命令(二)select查询操作
条件查询 使用Where进行数据筛选结果为True的会出现在结果集里面 select 字段 from 表名 where 条件; # 例: select * from test_table where ...
- Catlike学习笔记(1.3)-使用Unity画更复杂的3D函数图像
第三篇来了-今天去参加了 Unite 2018 Berlin,感觉就是....非常困...回来以后稍微睡了下清醒了觉得是时候认真学习下了,不过讲的很多东西都是还没有发布或者只有 Preview 的版本 ...
- 《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS
构造一个简单的Linux系统MenuOS 一.linux内核源代码简介 三大法宝(存储程序计算机.函数调用堆栈.中断)和两把宝剑(中断上下文的切换:保存现场和恢复现场.进程上下文的切换) 1.在lin ...
- 《linux内核设计与实现》第二章
第二章 从内核出发 一.获取内核源码 1.使用Git(linux创造的系统) 使用git来获取最新提交到linux版本树的一个副本: $ git clone git://git.kernel.org/ ...
- “数学口袋精灵”第二个Sprint计划(第三天)
“数学口袋精灵”第二个Sprint计划----第三天进度 任务分配: 冯美欣:欢迎界面的背景音乐完善 吴舒婷:游戏界面的动作条,选择答案后的音效 林欢雯:代码算法设计 进度: 冯美欣:欢迎界面背景 ...
- VS2013新建web项目时出错,系统找不到指定文件
好不容易找了一个VS2013_RTM_ULT_CHS来安装好,Key:BWG7X-J98B3-W34RT-33B3R-JVYW9 兴高采烈的打开vs2013,新建web项目,结果弹出一个错误: 傻眼了 ...
- 课堂final发布
项目组名:奋斗吧兄弟 小组成员:黄兴.李俞寰.栾骄阳.王东涵.杜桥 今天6个小组在课上进行了Final发布,以下是我的一些看法: 1.Nice团队的约跑app: 今天Nice团队给我的最突出的印象就是 ...
- psp进度统计
每周例行报告 本周PSP 类别 任务 开始时间 结束时间 被打断时间 总计工作时间 11月8日 代码 参与团队项目 10:13 11:30 0 77min 写博客 词频统计总结 13:35 14 ...
- Python3《机器学习实战》学习笔记(一):k-近邻算法(史诗级干货长文)
https://blog.csdn.net/c406495762/article/details/75172850
- CentOS 下运行Docker 内执行 docker build 命令的简单方法
1. 通过部分文档进行学习...主要知识来源 https://blog.csdn.net/shida_csdn/article/details/79812817 2. 下载 docker 的rpm包. ...