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 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你感受到的容易,一定有人为你承担不容易 这句话更像是描述生活的,许许多多的磕磕绊绊总 ...
随机推荐
- 介绍几种IC卡
介绍几种IC卡 Mifare卡:工作频率:13.56MHZ数据保存期:10年 操作时间:96ms读写距离:2.5-10cm 存储容量:8Kbit尺寸:85.6x54x0.76mm 存储器类型:EE ...
- WIN7 64位通过VPN远程登录 ASP.Net通过VPN访问Oracle服务器
因为客户这边的服务器是64位的,所以本人手贱,把系统换成了64位的win7,以为来客户这边工作会更方便,谁知道来到客户这边,进不了他们公司的内网,然后给我一个VPN的账号,先VPN然后才能登录他们的测 ...
- MyEclipse修改
MyEclipse设置编码方式 http://www.cnblogs.com/susuyu/archive/2012/06/27/2566062.html Eclipse添加Spket插件实现ExtJ ...
- Saiku对Measure(指标)查询结果进行计算后显示的方法
在通过Saiku查询数据的时候,当需要改变查询结果的显示方式的时候,可以添加formatString属性,但是当需要计算查询结果的时候,则需要使用CellFormatter,使用方法如下: <M ...
- 弹飞DZY(思维,打表,还没过全,先放着)
弹飞DZYDescription某天,机智的ZZC发明了一种超级弹力装置,为了在他的朋友DZY面前显摆,他邀请DZY一起玩个游戏.游戏一开始,ZZC在地上沿着一条直线摆上n个装置,每个装置设定初始弹力 ...
- AIDL 发生异常的原因 Android java.lang.SecurityException: Binder invocation to an incorrect interface
我建立了两个project.一个是activity 的 ,一个是service 的. 在进行两个project通信时,应该有以下几点注意: 1.在activity project中引入service ...
- swift论坛正式上线
www.iswifting.com swift论坛正式上线.有问答专区,也有技术分享区,还有学习资料区,大家一起学习成长! 2014中国互联网大会于8月26日开幕. 政府主管部门.行业专家.企业领袖将 ...
- Filter及FilterChain的使用具体解释
一.Filter的介绍及使用 什么是过滤器? 与Servlet类似,过滤器是一些web应用程序组件,能够绑定到一个web应用程序中.可是与其它web应用程序组件不同的是,过滤器是"链&quo ...
- JavaScript之childNodes属性、nodeType属性学习
1.childNodes属性:在一颗节点树上,childNodes属性可以用来获取任何一个元素的所有元素,它是一个包含这个元素所有子元素的数组. <body> <script typ ...
- Linux下文件及目录的一些操作(附递归遍历目录源码)
1.获取当前工作目录 #include <unistd.h> 1.char *getcwd(char *buf,size_t size); 2. 3.其中,buf为缓冲区地址,size为给 ...