码迷,mamicode.com
首页 > 编程语言 > 详细

java设计模式----单例模式

时间:2018-11-10 23:58:36      阅读:354      评论:0      收藏:0      [点我收藏+]

标签:读取   直接   zed   延迟加载   优化   操作系统   mda   管理器   style   

目录

    1.使用单例模式的作用

  2.常见的应用场景

  3.单例模式的实现方式

    4.总结

一、使用单例模式的作用

  

  单例模式:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。

二、常见的应用场景

 

  1.Windows的任务管理器

  2.Windows的回收站

  3.操作系统的文件系统

  4.Servlet 中的Application作用域

  5.Spring中的每个Bean都是单例

  6.Servlet中每个Servlet都是单例

三、单例模式的实现方式

 

  常见的五种实现方式:

  1.饿汉式(线程安全,调用效率高。但是不能延迟加载)

  2.懒汉式(线程安全,调用效率不高,但是可以延迟加载)

  3.双重检测锁式(由于JVM底层内部原因,偶尔会出现问题,不建议使用)

  4.静态内部类式(线程安全,调用效率高,可以延迟加载)

  5.枚举单例(线程安全,调用效率高,不能延迟加载)

 

  1、饿汉式

  

 1 package com.demo.singleton;
 2 /**
 3  * 饿汉式单例设计模式实现
 4  */
 5 public class Singleton1 {
 6     
 7     private static Singleton1 singleton = new Singleton1();
 8     //私有化构造方法
 9     private Singleton1(){}
10     public static Singleton1 getSingleton(){
11         return singleton;
12     }
13 }

  

  2、懒汉式

 

 1 package com.demo.singleton;
 2 /**
 3  * 懒汉式单例设计模式实现
 4  */
 5 public class Singleton2 {
 6     
 7     private static Singleton2 singleton;
 8     //私有化构造方法
 9     private Singleton2(){}
10     public synchronized static Singleton2 getSingleton(){
11         if(singleton==null){
12             singleton = new Singleton2();
13         }
14         return singleton;
15     }
16 }

 

  3、双重检测锁(不推荐)

 

 1 package com.demo.singleton;
 2 /**
 3  * 双重检测锁实现单例设计模式
 4  */
 5 public class Singleton3 {
 6     
 7     private static Singleton3 singleton=null;
 8     //私有化构造方法
 9     private Singleton3(){}
10     public static Singleton3 getSingleton(){
11         if(singleton==null){
12             Singleton3 sc;
13             synchronized(Singleton3.class){
14                 sc = singleton;
15                 if(sc == null){
16                     synchronized(Singleton3.class){
17                         if(sc == null){
18                             sc = new Singleton3();
19                         }
20                     }
21                     singleton=sc;
22                 }
23             }
24         }
25         return singleton;
26     }
27 }

 

  4、静态内部类实现方式

 

 1 package com.demo.singleton;
 2 /**
 3  * 静态内部类实现单例设计模式
 4  */
 5 public class Singleton4 {
 6     private static class singleton{
 7         private static final Singleton4 singleton= new Singleton4(); 
 8     }
 9     private Singleton4(){}
10     public static Singleton4 getSingleton(){
11         return singleton.singleton;
12     }
13 }

 

  5、使用枚举实现单例模式

 

 1 package com.demo.singleton;
 2 /**
 3  * 使用枚举实现单例模式
 4  */
 5 public enum Singleton5 {
 6     /**
 7      * 定义一个枚举元素,这个枚举元素本身就代表着一个单例
 8      */
 9     SINGLETON;
10     //定义这个单例的操作
11     public Singleton5 getSingleton(){
12         return SINGLETON;
13     }
14 }

 

四、总结

  单例模式的优点:

  ——由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动

时直接产生一个单例对象,然后永久驻留内存的方式来解决

  ——单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理

  具体使用哪种单例模式:

  – 单例对象 占用 资源 少,不需要 延时加载:

  • 枚举式 好于 饿汉式

  – 单例对象 占用 资源 大,需要 延时加载:

  • 静态内部类式 好于 懒汉式

 

java设计模式----单例模式

标签:读取   直接   zed   延迟加载   优化   操作系统   mda   管理器   style   

原文地址:https://www.cnblogs.com/bananafish/p/9940709.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!