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 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你感受到的容易,一定有人为你承担不容易 这句话更像是描述生活的,许许多多的磕磕绊绊总 ...
随机推荐
- Eclipse 打包过滤 Log.e
我们在开发时,经常会输出各种日志来debug代码.但是等到应用发布的apk运行时不希望它输出日志. 关闭输出日志Log.v(),Log.i(),Log.w(),Log.v(),Log.e()等 原理: ...
- php正则的使用[替换,匹配]
// 隐藏电话的中间四位 echo parseMobile('15836365252'); function parseMobile($mobile, $start = 4, $len = 4){ $ ...
- Sencha Touch对DOM的访问及控制
HTML代码: <!doctype html> <html> <head> <meta charset="utf-8"> <t ...
- 关于QT、GCC、GNU下各个版本的下载地址
http://download.qt.io/ http://ftp.gnu.org/gnu/gcc/ http://ftp.gnu.org/pub/gnu/
- linux note
用 &&组合两个命令,比如: cd dir && ls
- HTML加载顺序总结测试
首先,页面加载顺序:解析HTML结构.加载外部脚本和样式表文件.解析并执行脚本代码.构造HTML DOM模型.加载图片等外部文件.页面加载完毕. 也就是:html → head → title → # ...
- 删除select中所有option选项
这样写 <select id="search"> <option>baidu</option> <option>sogou</ ...
- C++_enum
C++的enum可以限制成员的类型 //error C2440: “=”: 无法从“int”转换为“color” #include <iostream> using namespace s ...
- sqoop安装与使用
sqoop简介 sqoop名字是怎么来的?Sqoop: SQL-to-Hadoop 连接传统数据库和hadoop的桥梁,把关系型数据库的数据导入到hadoop系统(如HDFS,HBASE和hive中) ...
- uva 301 Transportation 铁路公司的阳谋 纯dfs暴力
题目比较难理解. 给出铁路的容量和站点数,以及几笔订单,要求算出如何盈利最大. 咋一看想贪心,但无法确定是最优解啊. 于是用dfs做,就两种状况,选与不选,先开一个每个站点的当前人数数组,假设要选,然 ...