java设计模式(二)单例模式 建造者模式
(三)单例模式
单例模式应该是最常见的设计模式,作用是保证在JVM中,该对象仅仅有一个实例存在。
长处:1、降低某些创建比較频繁的或者比較大型的对象的系统开销。
2、省去了new操作符,减少系统内存使用频率,减轻GC压力。
3、保证核心代码的唯一性,比方交易引擎。
单例模式看似是最简单的设计模式。
public class Singleton {
//私有构造方法,防止实例化
private Singleton(){
}
//创建类的实例的时候载入
private static Factory factory = new Factory();
//延迟载入
private static Factory factory1;
public static Factory getInstans(){
if(factory1 == null){
factory1 = new Factory();
}
return factory1;
}
}
上面是比較常见的单例模式的写法,后一种延迟载入应该是实际应用中使用比較多的方式,可是这样的载入方式假设在多线程模式下就有可能出现故障。对于多线程的处理,第一个想到的就是 synchronized 线程锁。
private static Factory factory;
private static Object classlock = Singleton.class;
public static Factory getInstances(){
synchronized (classlock) {
if(factory == null){
factory = new Factory();
}
return factory;
}
}
public static Factory getInstance(){
if(factory == null){
syncInit();
}
return factory;
}
private static synchronized void syncInit(){
if(factory == null){
factory = new Factory();
}
}
以上是两种线程锁的方法,第一种是对象锁,可是由于每次调用都须要加锁,性能会有部分损失。另外一种是方法锁。可是实际上,不管 synchronized keyword加在方法上还是对象上,它取得的锁都是对象,而不是吧一段代码或函数当作锁。
单例模式是为了保证类仅仅有一个实例,并为类提供全局訪问点,单例模式最富盛名,可是最easy误用,不要让它成为创建全局变量的花哨方法。类应该仅仅须要知道与它协作的对象,不必了解创建它须要的限制。单例模式一定要记住隐藏构造函数,也就是在类里面写一个
private 的构造函数。
(四)建造者模式
建造者模式的意图是将类的构建逻辑转移到类的实例化外部。建造者模式比抽象工厂模式又复杂一点,抽象工厂有一个 Factory 如今多一个工厂的主管 Director
他来管理工厂的生产过程。
interface Builder {
void buildPartA();
void buildPartB();
void buildPartC();
Product getResult();
}
interface Product { }
interface Part { }
class Car implements Product{
private String door;
private String windows;
public String getDoor() {
return door;
}
public void setDoor(String door) {
this.door = door;
}
public String getWindows() {
return windows;
}
public void setWindows(String windows) {
this.windows = windows;
}
}
//详细建造工具
class ConcreteBuilder implements Builder {
Part partA, partB, partC;
private static Car product = new Car();
public void buildPartA() {
//这里是详细怎样构建partA的代码
product.setDoor("铁的");
};
public void buildPartB() {
//这里是详细怎样构建partB的代码
product.setWindows("玻璃的");
};
public void buildPartC() {
//这里是详细怎样构建partB的代码
};
public Product getResult() {
return product;
//返回最后组装成品结果
};
}
//详细建造工具
class ConcreteBuilder2 implements Builder {
Part partA, partB, partC;
private static Car product = new Car();
public void buildPartA() {
//这里是详细怎样构建partA的代码
product.setDoor("木头的");
};
public void buildPartB() {
//这里是详细怎样构建partB的代码
product.setWindows("玻璃的");
};
public void buildPartC() {
//这里是详细怎样构建partB的代码
};
public Product getResult() {
return product;
//返回最后组装成品结果
};
}
//建造者
class Director {
private Builder builder;
public Director( Builder builder ) {
this.builder = builder;
}
public void construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}
public class BuilderPattern {
public static void main(String[] args){
//获得详细的工厂
ConcreteBuilder2 builder = new ConcreteBuilder2();
//将工厂给管理者
Director director = new Director( builder );
//管理者构造出产品
director.construct();
//在工厂取得产品
Car product = (Car) builder.getResult();
System.out.println(product.getDoor());
}
}
不同的工厂就会生产出不同的产品,可是生产什么产品是管理者决定的,假如管理者的
construct
不生产门了,那么终于的产品也就没有门了。
建造者模式能够控制中间的生产过程,比方读取 xml 时候用来推断某个值是否有数据。或者拼装 sql 语句的时候
SqlString sql = new SqlString();
if(forUpdate) {
sql.selectForUpdate(db);
} else {
sql.select(db);
}
sql.from(db).where().eq(db);
java设计模式(二)单例模式 建造者模式的更多相关文章
- Java设计模式学习记录-建造者模式
前言 今天周末,有小雨,正好也不用出门了,那就在家学习吧,经过了两周的面试,拿到了几个offer,但是都不是自己很想去的那种,要么就是几个人的初创小公司,要么就是开发企业内部系统的这种传统开发,感觉这 ...
- java设计模式-----6、建造者模式
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类 ...
- Java设计模式14:建造者模式
什么是建造者模式 发现很多框架的源码使用了建造者模式,看了一下觉得挺实用的,就写篇文章学习一下,顺便分享给大家. 建造者模式是什么呢?用一句话概括就是建造者模式的目的是为了分离对象的属性与创建过程,是 ...
- Java设计模式之(建造者模式)
建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式通常包括下面几个角色: 1. builder:抽象建造者,给出一个抽象接口,以规范产品对象的各个组 ...
- JAVA设计模式之【建造者模式】
建造者模式 建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品 角色 Builder抽象建造者 buildPartX getResult ConcreteBuilder具体建 ...
- 【java设计模式】-05建造者模式
建造者模式 简述 建造者模式,是将一个复杂对象的创建和它的表示分离开来,这就使得同样的构建构成可以有不同的表示. 建造者模式是一步步构建一个复杂的对象,允许用户只需要指定复杂对象的类型和必要的内容就可 ...
- java设计模式(二)---工厂方法模式
2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...
- 重学 Java 设计模式:实战建造者模式
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 乱码七糟 [luàn qī bā zāo],我时常怀疑这个成语 ...
- 重学 Java 设计模式:实战桥接模式(多支付渠道「微信、支付宝」与多支付模式「刷脸、指纹」场景)
作者:小傅哥 博客:https://bugstack.cn - 编写系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么你的代码那么多ifelse 同类的业务.同样的功能, ...
- 重学 Java 设计模式:实战外观模式「基于SpringBoot开发门面模式中间件,统一控制接口白名单场景」
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你感受到的容易,一定有人为你承担不容易 这句话更像是描述生活的,许许多多的磕磕绊绊总 ...
随机推荐
- php笔试算法题:顺时针打印矩阵坐标-蛇形算法
这几天参加面试,本来笔试比较简单,但是在面试的时候,技术面试官说让我现场写一个算法,顺时针打印矩阵的坐标,如图所示 顺序为,0,1,2,3,4,9,14,19,24,23,22,21,20,15,10 ...
- 影响世界的IT
MIT BBS上说微软电话面试的一道题就是"Who do you think is the best coder,and why?”.我觉得挺有意思的,也来凑个热闹.排名不分先后. 1.Bi ...
- 有关文件夹与文件的查找,删除等功能 在 os 模块中实现
最近在写的程序频繁地与文件操作打交道,这块比较弱,还好在百度上找到一篇不错的文章,这是原文传送门,我对原文稍做了些改动. 有关文件夹与文件的查找,删除等功能 在 os 模块中实现.使用时需先导入这个模 ...
- Oracle EBS-SQL (SYS-19):sys-用户登陆纪录查询.sql
select * from fnd_user t where t.user_name='user_name'
- [问题解决] "Nautilus could not create the required folder "/home/kenneth/.config/nautilus"
错误: "Nautilus could not create the required folder "/home/kenneth/.config/nautilus" 发 ...
- Qt 的线程与事件循环——可打印threadid进行观察槽函数到底是在哪个线程里执行,学习moveToThread的使用)
周末天冷,索性把电脑抱到床上上网,这几天看了 dbzhang800 博客关于 Qt 事件循环的几篇 Blog,发现自己对 Qt 的事件循环有不少误解.从来只看到现象,这次借 dbzhang800 的博 ...
- rsyslog masg和rawmsg的区别
msg the MSG part of the message (aka "the message" ;)) message 的MSG 部分 rawmsg the message ...
- Windows Azure 社区新闻综述(#70 版)
欢迎查看最新版本的每周综述,其中包含有关云计算和 Windows Azure 的社区推动新闻.内容和对话. 以下是过去一周基于您的反馈汇集在一起的内容: 文章.视频和博客文章 · 如何选择 No ...
- Android之条码扫描二维码扫描
Android之条码扫描二维码扫描 二维码条形码扫描,参考技术网址: 1.Apache License 2.0 开源的ZXing项目的简化版 http://xinlanzero.iteye.com/b ...
- 《4》CentOS7.0+OpenStack+kvm云平台部署—配置Nova
感谢朋友支持本博客,欢迎共同探讨交流,因为能力和时间有限,错误之处在所难免,欢迎指正! 假设转载.请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...