设计模式是什么?

  设计模式是一种思路,是在前辈们的软件工程中总结出来的套路,并且这些套路已经经过很多项目的测试,是比较成熟的思路,所以现在来总结一下常见的设计模式。

  最简单最常用的就是单例模式:

  一般单例模式包括两种,一种是懒汉式,另外一种是饱汉式的,下面从三个方面来介绍单例模式:

  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-单例模式的更多相关文章

  1. Java设计模式之《单例模式》及应用场景

    摘要: 原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6510196.html 所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该 ...

  2. Java设计模式之【单例模式】

    Java设计模式之[单例模式] 何为单例 在应用的生存周期中,一个类的实例有且仅有一个 当在一些业务中需要规定某个类的实例有且仅有一个时,就可以用单例模式 比如spring容器默认初始化的实例就是单例 ...

  3. Java设计模式中的单例模式

    有时候在实际项目的开发中,我们会碰到这样一种情况,该类只允许存在一个实例化的对象,不允许存在一个以上的实例化对象,我们将这种情况称为Java设计模式中的单例模式.设计单例模式主要采用了Java的pri ...

  4. 重学 Java 设计模式:实战单例模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 5个创建型模式的最后一个 在设计模式中按照不同的处理方式共包含三大类:创建型模式.结 ...

  5. Java设计模式4:单例模式

    前言 非常重要,单例模式是各个Java项目中必不可少的一种设计模式.本文的关注点将重点放在单例模式的写法以及每种写法的线程安全性上.所谓"线程安全性"的意思就是保证在创建单例对象的 ...

  6. 10.Java设计模式 工厂模式,单例模式

    Java 之工厂方法和抽象工厂模式 1. 概念 工厂方法:一抽象产品类派生出多个具体产品类:一抽象工厂类派生出多个具体工厂类:每个具体工厂类只能创建一个具体产品类的实例. 即定义一个创建对象的接口(即 ...

  7. Java设计模式探讨之单例模式

    单例模式是在平时的项目开发中比较常见的一种设计模式,使用比较普遍,网上的资料也是一抓一大把,小Alan也来凑凑热闹,为以后充实点设计模式相关的内容做个简单的开篇. 单例模式是一种创建对象的模式,用于产 ...

  8. Java设计模式学习01——单例模式(转)

    原地址:http://blog.csdn.net/xu__cg/article/details/70182988 Java单例模式是一种常见且较为简单的设计模式.单例模式,顾名思义一个类仅能有一个实例 ...

  9. 【java设计模式】-04单例模式

    单例模式 定义: 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 类型: 创建类模式 类图: 单例模式特点 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单 ...

  10. Java设计模式09:单例模式的强化(控制实例个数n)

    1. 单例模式的本质: 控制实例数目(目的节约资源) 2. 单例模式体现的一些思想: (1)延迟装载(Lazy Load):懒汉式 (2)缓存:饿汉式 3. 单例模式的变形使用: 控制使用实例个数为3 ...

随机推荐

  1. 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 特殊问题和实战经验(五)

    RAC 特殊问题和实战经验(五) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...

  2. 增强学习(二)----- 马尔可夫决策过程MDP

    1. 马尔可夫模型的几类子模型 大家应该还记得马尔科夫链(Markov Chain),了解机器学习的也都知道隐马尔可夫模型(Hidden Markov Model,HMM).它们具有的一个共同性质就是 ...

  3. 学习SpringMVC——国际化+上传+下载

    每个星期一道菜,这个星期也不例外~~~ 一个软件,一个产品,都是一点点开发并完善起来的,功能越来越多,性能越来越强,用户体验越来越好……这每个指标的提高都需要切切实实的做点东西出来,好比,你的这个产品 ...

  4. 【分布式】Zookeeper服务端启动

    一.前言 前面已经了解了Zookeeper会话相关知识点,接着来学习Zookeeper服务端相关细节. 二.服务端 服务端整体架构如下 Zookeeper服务器的启动,大致可以分为以下五个步骤 1. ...

  5. [原创]django+ldap实现统一认证部分一(django-auth-ldap实践)

    前言 接之前我的文章,django+ldap+memcache实现单点登录+统一认证 ,ldap部署相关,ldap双机\LAM配置管理\ldap备份还原,目前来说,我们已经有了高可用性的ldap环境了 ...

  6. css预处理器sass使用教程(多图预警)

    css预处理器赋予了css动态语言的特性,如变量.函数.运算.继承.嵌套等,有助于更好地组织管理样式文件,以及更高效地开发项目.css预处理器可以更方便的维护和管理css代码,让整个网页变得更加灵活可 ...

  7. 【C#】组件发布:MessageTip,轻快型消息提示窗

    -------------201610212046更新------------- 更新至2.0版,基本完全重写,重点: 改为基于原生LayeredWindow窗体和UpdateLayeredWindo ...

  8. C#开发微信门户及应用(34)--微信裂变红包

    在上篇随笔<C#开发微信门户及应用(33)--微信现金红包的封装及使用>介绍了普通现金红包的封装和使用,这种红包只能单独一次发给一个人,用户获取了红包就完成了,如果我们让用户收到红包后,可 ...

  9. Yii2.X 多语言-类图

  10. struts2类型转换

    1. Struts2中的类型转换 我们知道通过HTTP提交到后台的数据,都是字符串的形式,而我们需要的数据类型当然不只字符串类型一种.所以,我们需要类型转换! 在Struts2中,类型转换的概念除了用 ...