简单讲解在Java编程中实现设计模式中的单例模式结构

 更新时间:2016年04月22日 09:32:13   作者:匆忙拥挤repeat  
这篇文章主要介绍了简单讲解在Java编程中实现设计模式中的单例模式结构,设计模式是最基本直白简单的一种设计模式,需要的朋友可以参考下

1. 模式介绍

模式的定义

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

模式的使用场景

确保某个类有且只有一个对象的场景,例如创建一个对象需要消耗的资源过多,如要访问 IO 和数据库等资源。

2. UML类图

201642293056020.png (600×189)

角色介绍:
(1)Client : 高层客户端。
(2)Singleton : 单例类。

3. 模式的简单实现

public class Singleton { 
  private static Singleton intance; 
  private Singleton() {} 
   
  public static Singleton getInstance() { 
    /* 
     * 一开始多线程进来,遇到锁,一个线程进去,是为空,new对象; 后续线程进入,不为空,不操作;最后直接返回 
     * 对象不为空,再有多个线程进入该函数,不为空,不执行加锁操作,直接返回 
     */ 
    if (intance == null) { 
      synchronized (Singleton.class) { 
        if (intance == null) { 
          intance = new Singleton(); 
        } 
      } 
    } 
    return intance; 
  } 
} 
 
class Singleton1 {// 懒汉式  
  private static Singleton1 intance = new Singleton1();//懒的,程序运行的时候就加载出来了 
  private Singleton1() {} 
   
  public static Singleton1 getInstance() { 
    return intance; 
  } 
} 
 
class Singleton2 {// 饿汉式 
  private static Singleton2 intance; 
  private Singleton2() {} 
   
  public static Singleton2 getInstance() {//用到的时候 才加载 
    if (intance == null) { 
      intance = new Singleton2(); 
    } 
    return intance; 
  } 
} 
 
class Singleton3 {// 饿汉式 线程安全 
  private static Singleton3 intance; 
  private Singleton3() {} 
   
  public synchronized static Singleton3 getInstance() {//用到的时候 才加载, 加锁 多线程调用,都有一个加锁的动作 
    if (intance == null) { 
      intance = new Singleton3(); 
    } 
    return intance; 
  } 
} 
 
class Singleton4 {// 饿汉式 线程安全 
  private static Singleton4 intance; 
  private Singleton4() {} 
   
  public static Singleton4 getInstance() {//用到的时候 才加载 
    synchronized (Singleton4.class) {// 加锁 效率跟3差不多 
      if (intance == null) { 
        intance = new Singleton4(); 
      } 
    } 
    return intance; 
  } 
} 

4.优点与缺点

(1)优点:

A.由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。
B.由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决;
C.单例模式可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。
D.单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。

(2)缺点
A.单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。

相关文章

  • SpringCloud Feign远程调用实现详解

    SpringCloud Feign远程调用实现详解

    Feign是Netflix公司开发的一个声明式的REST调用客户端; Ribbon负载均衡、 Hystrⅸ服务熔断是我们Spring Cloud中进行微服务开发非常基础的组件,在使用的过程中我们也发现它们一般都是同时出现的,而且配置也都非常相似
    2022-11-11
  • Spring Boot 集成Mybatis实现主从(多数据源)分离方案示例

    Spring Boot 集成Mybatis实现主从(多数据源)分离方案示例

    本篇文章主要介绍了Spring Boot 集成Mybatis实现主从(多数据源)分离方案实例,具有一定的参考价值,有兴趣的可以了解一下。
    2017-03-03
  • 项目管理利器-Maven(Windows安装)图文教程

    项目管理利器-Maven(Windows安装)图文教程

    下面小编就为大家带来一篇项目管理利器-Maven(Windows安装)图文教程。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Java简明解读代码块的应用

    Java简明解读代码块的应用

    所谓代码块是指用"{}"括起来的一段代码,根据其位置和声明的不同,可以分为普通代码块、构造块、静态块、和同步代码块。如果在代码块前加上 synchronized关键字,则此代码块就成为同步代码块
    2022-07-07
  • Java利用字符流轻松处理文本数据

    Java利用字符流轻松处理文本数据

    在Java中,文本数据是经常处理的一种数据类型,而字符流就是用来处理文本数据的一种流,下面就为大家介绍一下Java字符流的基本概念、常用类和方法,以及如何使用字符流来读写文件吧
    2023-09-09
  • SpringBoot注册第三方Bean的方法总结

    SpringBoot注册第三方Bean的方法总结

    众所周知,SpringBoot默认会扫描启动类所在的包及其子包,一般我们都是在需要的类上通过注解的方式去将Bean注册交给IOC进行管理,但是注册第三方Bean的方案却不支持,所以本文给大家介绍了SpringBoot注册第三方Bean的方法,需要的朋友可以参考下
    2024-01-01
  • Java基础Map集合详析

    Java基础Map集合详析

    这篇文章主要介绍了Java基础Map集合详析,主要通过介绍Map集合的常用方法、Map的获取方法的一些相关资料展开内容,需要的小伙伴可以参考一下
    2022-04-04
  • 一文详解Java中的原子操作

    一文详解Java中的原子操作

    在Java中,原子操作尤为重要,尤其是在多线程环境中,想象一下,如果小黑在操作一个共享变量时,这个操作被其他线程打断,那会发生什么?可能会导致数据不一致,或者更糟糕的情况,本文将给大家详细介绍一下Java中的原子操作
    2024-01-01
  • Java实现十秒向MySQL插入百万条数据

    Java实现十秒向MySQL插入百万条数据

    这篇文章主要为大家详细介绍了Java如何实现十秒向MySQL插入百万条数据,文中的示例代码讲解详细,对我们学习或工作有一定借鉴价值,需要的可以参考一下
    2022-11-11
  • 举例讲解Java中synchronized关键字的用法

    举例讲解Java中synchronized关键字的用法

    这篇文章主要介绍了Java中synchronized关键字的用法,针对synchronized修饰方法的使用作出了简单讲解和演示,需要的朋友可以参考下
    2016-04-04

最新评论