设计模式是什么?

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

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

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

  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. SQL连接

    SQL连接可以分为内连接.外连接.交叉连接. 数据库数据:             book表                                          stu表 1.内连接 ...

  2. 自己动手,实现一种类似List<T>的数据结构(二)

    前言: 首先,小匹夫要祝各位看官圣诞快乐,新年愉快-.上一篇文章<自己动手,实现一种类似List<T>的数据结构(一)> 介绍了一下不依靠List<T>实现的各种接 ...

  3. 纯WebApi,不包含MVC Demo

    1.创建项目 只是单纯的使用Web API的功能,而不需要使用的MVC,这个时候就该抛开MVC来新建项目了. 首先,新建一个Asp.Net空应用程序,在程序集中添加引用System.Web.Http和 ...

  4. html5语义化标签使用规范

    Html5添加了很多语义化标签,一个典型的html5页面结构可以如下安排 一.使用案例 1. 头部——header和nav标签 header头部,body下的直接子元素header一般用于放页面的介绍 ...

  5. Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...

  6. java中动态代理的实现

    动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...

  7. SpringMVC之HandlerMapping源码剖析(一)

    学习一种知识,我喜欢看看源码是怎么进行它们类之间的关系以及方法的调用,是怎么实现的.这样我才感觉踏实. 既然现在谈到HandlerMapping,我们先知道HandlerMapping的作用:Hand ...

  8. React Native初探

    前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...

  9. iOS通知的整理笔记

    iOS通知用于高耦合界面的传值确实方便快捷. 需要实现模态弹出的视图控制器上,有一个视图控制器可以导航.这必定要将这个视图控制器的导航视图控制器naVC.view添加到模态弹出的视图控制器presen ...

  10. 【转】Android SDK Samples,学习Android的好方法

    转载地址:http://blog.csdn.net/rowland001/article/details/50886288 从今天开始呢,我要开始学习Google家自己出的Android代码示例,总觉 ...