JAVA设计模式之1-单例模式
设计模式是什么?
设计模式是一种思路,是在前辈们的软件工程中总结出来的套路,并且这些套路已经经过很多项目的测试,是比较成熟的思路,所以现在来总结一下常见的设计模式。
最简单最常用的就是单例模式:
一般单例模式包括两种,一种是懒汉式,另外一种是饱汉式的,下面从三个方面来介绍单例模式:
1,What?
单例就是单例对象的类只能允许一个实例存在。
2, Why?
很多时候整个系统需要拥有一个全局对象,这样整个系统使用的对象是保持一致的,比如说程序的配置信息,程序的辅助方法等等,其他类要调用这个配置信息或者公共方法的时候,可以通过这个单例类对象来获取。
3, How?
怎么使用这个单例呢?有两种方式,饱汉式和饿汉式,区别是什么呢?饱汉式是加载类时就实现实例化,饿汉式是用的时候才实例化。
实现思路
1,将类构造方法定义为私有方法,这样其他类就无法通过调用构造函数来实例化新的对象,并且通过这个类的静态方法来得到这个类的唯一对象。
2,在类内提供一个静态方法,当外部类调用这个方法的时候,如果类持有的引用不为空就返回这个引用,如果为空则创建这个类的实例。
可能存在问题
单线程的时候上面这个思路实现很好,但是现实中有很多程序是多线程的程序,这个时候就会出现多个实例,原因是,当一个线程判断完没有单例对象的时候,要新建一个单例对象,但是在新建完成之前,又来了几个线程也吵着要单例对象,然后发现没有,就都开始建单例对象,这样就出现在这样的问题,建造了多个单例对象,解决方法是什么呢,那就是上一把锁,一把互斥锁。
下面是常用的
1,饿汉式,代码如下
public class Gloabl {
private Gloabl() {
}
public static Gloabl getInstance(){
return INSTANCE;
}
//方法一,静态常量
private final static Gloabl INSTANCE = new Gloabl();
//方法二,静态代码块,当类加载的时候自动加载
// private final static Gloabl INSTANCE ;
// static {
// INSTANCE = new Gloabl();
// }
}
懒汉式
优点:写法简单,加载类的时候就自动加载,避免了线程同步的问题
缺点:在类加载的时候就完成实例化,如果整个过程没有用到这个,则会造成内存资源的浪费,所以,我们需要新的加载方法,懒汉式,用时候再加载,不用不加载
2,懒汉时,代码如下
方法一,采用同步锁
public class Gloabl {
private static Gloabl INSTANCE;
private Gloabl() {
}
public static Gloabl getInstance() {
if (INSTANCE == null) {
synchronized (Gloabl.class) {
if (INSTANCE == null) {
INSTANCE = new Gloabl();
}
}
}
return INSTANCE;
}
}
采用同步锁
方法二,采用静态内部类
public class Gloabl {
private Gloabl() {
}
private static class GloablInstance{
private static final Gloabl INSTANCES = new Gloabl();
}
public static Gloabl getInstances(){
return GloablInstance.INSTANCES;
}
}
采用静态类
这个是饿汉式的变形版本,只有在调用getInstance方法的时候才来实例化这个实例,静态类只会在第一次加载类的时候初始化,即JVM帮助我们保证了线程的安全性,推荐使用这种方法。
JAVA设计模式之1-单例模式的更多相关文章
- Java设计模式之《单例模式》及应用场景
摘要: 原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6510196.html 所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该 ...
- Java设计模式之【单例模式】
Java设计模式之[单例模式] 何为单例 在应用的生存周期中,一个类的实例有且仅有一个 当在一些业务中需要规定某个类的实例有且仅有一个时,就可以用单例模式 比如spring容器默认初始化的实例就是单例 ...
- Java设计模式中的单例模式
有时候在实际项目的开发中,我们会碰到这样一种情况,该类只允许存在一个实例化的对象,不允许存在一个以上的实例化对象,我们将这种情况称为Java设计模式中的单例模式.设计单例模式主要采用了Java的pri ...
- 重学 Java 设计模式:实战单例模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 5个创建型模式的最后一个 在设计模式中按照不同的处理方式共包含三大类:创建型模式.结 ...
- Java设计模式4:单例模式
前言 非常重要,单例模式是各个Java项目中必不可少的一种设计模式.本文的关注点将重点放在单例模式的写法以及每种写法的线程安全性上.所谓"线程安全性"的意思就是保证在创建单例对象的 ...
- 10.Java设计模式 工厂模式,单例模式
Java 之工厂方法和抽象工厂模式 1. 概念 工厂方法:一抽象产品类派生出多个具体产品类:一抽象工厂类派生出多个具体工厂类:每个具体工厂类只能创建一个具体产品类的实例. 即定义一个创建对象的接口(即 ...
- Java设计模式探讨之单例模式
单例模式是在平时的项目开发中比较常见的一种设计模式,使用比较普遍,网上的资料也是一抓一大把,小Alan也来凑凑热闹,为以后充实点设计模式相关的内容做个简单的开篇. 单例模式是一种创建对象的模式,用于产 ...
- Java设计模式学习01——单例模式(转)
原地址:http://blog.csdn.net/xu__cg/article/details/70182988 Java单例模式是一种常见且较为简单的设计模式.单例模式,顾名思义一个类仅能有一个实例 ...
- 【java设计模式】-04单例模式
单例模式 定义: 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 类型: 创建类模式 类图: 单例模式特点 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单 ...
- Java设计模式09:单例模式的强化(控制实例个数n)
1. 单例模式的本质: 控制实例数目(目的节约资源) 2. 单例模式体现的一些思想: (1)延迟装载(Lazy Load):懒汉式 (2)缓存:饿汉式 3. 单例模式的变形使用: 控制使用实例个数为3 ...
随机推荐
- Hadoop入门学习笔记---part4
紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...
- mac linux rename命令行批量修改文件名
我的mac使用命令行批量修改名字时发现居然没有rename的指令: zsh: command not found: rename 所以使用HomeBrew先安装一下: ➜ ~ brew install ...
- Uploadify 结合 Web API 2 上传问题
最近使用jQuery.Uploadify和Web API配合来做上传,碰到问题,还木有办法解决,记录一下: 环境:jQuery 1.10.2,Uploadify 3.2.1,SWFObject 2.2 ...
- Java语言中的面向对象特性总结
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
- 有点激动,WPF换肤搞定了!
一如既往没废话! wpf桌面应用开发都是window内引入很多个UserControl. 如果你有通过不同颜色来换肤的需求,那么下面我就将整个过程! 分2个步骤: 1.主窗体背景色替换: 2.同时界面 ...
- [翻译+山寨]Hangfire Highlighter Tutorial
前言 Hangfire是一个开源且商业免费使用的工具函数库.可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于Windows ...
- bzoj1878--离线+树状数组
这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...
- 使用Eclipse创建Maven Web工程
方法/步骤 1 使用Eclipse创建Maven Web工程 2 找到Maven Project,点击Next 3 勾选上Create a simple project (不使用骨架),Next 4 ...
- 设计模式-代理模式(Proxy Model)
文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/5988145.html 目录 1.写在前面 2.概述 3.目的 4.结构组成 5.实现 5 ...
- 今天思考一个问题,PHP const和static的区别
static关键字在类中是,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享,能一定程序对该成员尽心 ...