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 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你感受到的容易,一定有人为你承担不容易 这句话更像是描述生活的,许许多多的磕磕绊绊总 ...
随机推荐
- python request使用
相比httplib.urllib,request真是太美丽了,记录下 下载安装地址:http://docs.python-requests.org/en/latest/user/install/#in ...
- 正确的注销PHP SESSION
/* 1.每个页面都必须开启session_start()后才能在每个页面里面使用session. 2.session_start()初始化session,第一次访问会生成一个唯一会话ID保存在客户端 ...
- c/c++实现混合编程
在开发中大家经常会使用到c与c++混合编程,这样能够更好的实现功能模块.刚学习了一下c和c++的混合编程,参考了网上的相关知识,在这里留下要点,方便以后进行查阅. 1.extern关键字 extern ...
- SiKuli 图形脚本语言【转载】
Sikuli 是一种新颖的图形脚本语言,或者说是一种另类的自动化测试技术.它与我们常用的自动化测试技术(工具)有很大的区别. 当你看到上图sikuli的脚本时,一定会惊呼,这样都可以~!脚本加截图~~ ...
- MySQL read_only选项的作用
1作用: 从字面意思上看就可以知道这个是把mysql设置为只读,但是这个只读只是针对一般用户而言的,对于root这种用super权限的用户read_only是没有用的. 2设置方式: set glob ...
- Python核心编程笔记---- print@2
print 的输出从定向问题 print 可以用’>>‘来重定向输出,下面是例子 f = open('D:/python.txt','w+') print >> f," ...
- dell PowerEdge R720 自动重启分析
dell PowerEdge R720 自动重启分析 摘要: 一,问题描述: 在同一批服务器当中,碰到这样一台服务器,如果不跑任何服务时没有问题,但一跑任务就是自动重启.既然同样的系统别的服务器都没出 ...
- Krita编译和旧版本下载
Linux For Krita 2.9, David Revoy's guide Building Krita for Cats is the best available! Build Krita ...
- windows的命令行工具和DOS工具的区别
很多的系统管理员可能认为命令行是程序员编程用的,这是不对的,其实命令行是另一种用来管理计算机的接口.1 命令行窗口 Windows NT/Windows 2000以后的操作系统为用户提供 ...
- iOS6和iOS7代码的适配(3)——坐标适配
由于iOS7里面status bar和视图是重叠在一起了,所以应用的y坐标就没法和以前一致了,需要重新计算设定.基本上,你的应用用Xcode5运行一下就能看见这个问题,这里写了一个最简单的例子,一个V ...