1.饿汉式

 1 package singleInstance;
 2 /**饿汉式,类加载时候创建实例,浪费资源,线程是安全的*/
 3 public class SingleDome01 {
 4     //私有构造方法,防止直接new对象
 5     private SingleDome01() {
 6     }
 7     //类加载的时候,创建对象
 8     private static SingleDome01 instance = new SingleDome01();
 9     //提供getter,方便外界访问私有对象
10     public static SingleDome01 getInstance() {
11         return instance;
12     }
13 }

2.懒汉式

 1 package singleInstance;
 2 /**懒汉式,被调用时候才会实例化,节约资源,高并发线程时不安全*/
 3 public class SingleDome02 {
 4     //私有构造方法,防止直接new对象
 5     private SingleDome02(){
 6     }
 7     private static SingleDome02 instance;
 8     //提供getter,以便外界调用私有对象,返回SingleDome02对象
 9     public static SingleDome02 getInstance() {
10         if(instance==null){
11             instance = new SingleDome02();
12         }
13         return instance;
14     }
15 }

3.饿汉式与懒汉式改良

 1 package singleInstance;
 2 /**采用内部类实例化对象,在调用时候才会加载,节约资源,还能保证线程是安全的*/
 3 public class SingleDome03 {
 4     //私有构造方法,防止直接new对象
 5     private SingleDome03() {
 6     }
 7     //静态内部类只有在调用时候才会加载
 8     private static class InnerSingleDome03{
 9         private static SingleDome03 instance = new SingleDome03();
10     }
11     public static SingleDome03 getInstance(){
12         return InnerSingleDome03.instance;
13     }
14 }

4.登记式

 1 package singleInstance;
 2
 3 import java.util.HashMap;
 4 import java.util.Map;
 5
 6 /**采用spring的用法,利用反射创建对象,讲实例注册到map里面,下次用的时候直接取*/
 7 public class SingleDome04 {
 8     //私有构造方法,防止外部直接new对象
 9     private SingleDome04() {
10     }
11     private static Map<String,SingleDome04> map = new HashMap<String,SingleDome04>();
12     //静态代码块,类加载时候实例化对象和map,并将对象放入map里
13     static{
14         SingleDome04 instance = new SingleDome04();
15         map.put(instance.getClass().getName(), instance);
16     }
17     public static SingleDome04 getInstance(String name){
18         if(name==null){
19             name="singleInstance.SingleDome04";
20         }
21         if(!map.containsKey(name)){
22             try {
23                 map.put(name, (SingleDome04)Class.forName(name).newInstance());
24             } catch (InstantiationException e) {
25                 e.printStackTrace();
26             } catch (IllegalAccessException e) {
27                 e.printStackTrace();
28             } catch (ClassNotFoundException e) {
29                 e.printStackTrace();
30             }
31         }
32         return map.get(name);
33     }
34 }

最后测试代码:

 1 package singleInstance;
 2
 3 public class TestSingle {
 4     public static void main(String[] args) {
 5         SingleDome01 s1 = SingleDome01.getInstance();
 6         SingleDome01 s2 = SingleDome01.getInstance();
 7         if(s1==s2){
 8             System.out.println("s1=s2");
 9         }else{
10             System.out.println("s1!=s2");
11         }
12         SingleDome02 s3 = SingleDome02.getInstance();
13         SingleDome02 s4 = SingleDome02.getInstance();
14         if(s3==s4){
15             System.out.println("s3=s4");
16         }else{
17             System.out.println("s3!=s4");
18         }
19         SingleDome03 s5 = SingleDome03.getInstance();
20         SingleDome03 s6 = SingleDome03.getInstance();
21         if(s5==s6){
22             System.out.println("s5=s6");
23         }else{
24             System.out.println("s5!=s6");
25         }
26         SingleDome04 s7 = SingleDome04.getInstance("singleInstance.SingleDome04");
27         SingleDome04 s8 = SingleDome04.getInstance("singleInstance.SingleDome04");
28         if(s7==s8){
29             System.out.println("s7=s8");
30         }else{
31             System.out.println("s7!=s8");
32         }
33     }
34 }

转载于:https://www.cnblogs.com/miyin/p/3963316.html

java 3种单例模式相关推荐

  1. java两种绑定方式_java两种单例模式用法分析

    本文实例讲述了java两种单例模式用法.分享给大家供大家参考,具体如下: 按照加载方式的不同,单例模式有两种实现: private:只能在同一个类中使用 static:该类是类方法,不能调用实例方法. ...

  2. Java设计模式之单例模式(七种写法)

    Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton {private static Singleton ...

  3. java 23种设计模式 04 单例模式

    java 23种设计模式 04 单例模式 一.什么是单例模式 单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象.也就是说,在整个程序空间中,该类只存在一个实例对象.   ...

  4. Java单例模式详解--七种单例模式实现+单例安全+实际应用场景

    单例模式 保证了一个类只有一个实例,并且提供了一个全局访问点.单例模式的主要作用是节省公共资源,方便控制,避免多个实例造成的问题. 实现单例模式的三点: 私有构造函数 私有静态变量维护对象实例 公有静 ...

  5. java中的单例_细说Java中的几种单例模式

    在Java中,单例模式分为很多种,本人所了解的单例模式有以下几种,如有不全还请大家留言指点: 饿汉式 懒汉式/Double check(双重检索) 静态内部类 枚举单例 一.饿汉式 image 饿汉式 ...

  6. java中的7种单例模式

    java中的7种单例模式 单例模式是我们开发中经常会用到的,单例模式的好处是应用在运行时只有一个实例,生命周期从单例实例化后一直到应用生命周期结束.这里总结和比较一下几种单例的形式,共总结了七种. 写 ...

  7. 【面试系列】6种单例模式(Singleton)实现方法比较

    转载文章,文章经 LiteCodes 授权,转载至本博客. 原文地址:[面试系列]6种单例模式(Singleton)实现方法比较 下述代码均省略了 Singleton 类的业务代码段,仅表现作为单例所 ...

  8. Java中的单例模式

    2019独角兽企业重金招聘Python工程师标准>>> 最近网上查找资料做了一下总结,Java中的单例模式主要是有以下两种实现方式: 1.public class Singleton ...

  9. 在Java中实现单例模式的有效方法是什么? [关闭]

    在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...

最新文章

  1. 重磅 | MIT启动IQ计划:研究人类智能,让全世界的机构共同合作
  2. 系统内存信息获取工具类
  3. 通过jS打包下载图片
  4. Hibernate关联映射-数据对象三种关系
  5. 工作68:子路由跳转
  6. android中给TextView或者Button的文字添加阴影效果
  7. 移植的7zip到Vxworks 取名vx7zip
  8. android h5链接蓝牙,h5+runtime Native.js 混合APP连接蓝牙打印机
  9. MIT6.830 Lab3 Query Optimization 实验报告
  10. linux 子进程exit6,linux 惊群有关问题
  11. java访问网络接口_Java网络访问 java调用http java调用其他接口
  12. [团队项目]英语学习助手之 NABC 模型
  13. mysql 联合主键自增,mysql联合主键自增、主键最大长度小记
  14. PHP下载远程图片的3个方法
  15. Python中的enumerate用法
  16. 制售《原神》外挂非法获利200万,外挂的危害有多大?
  17. 文件底层I/O基本操作——东写西读南开北关中位移_莫韵乐的Linux英雄传
  18. matlab中欠定方程组超定方程组_学会这些三元一次方程组的解法思路与运用,初中不再怕解方程...
  19. VUE-flex布局之align-content多交叉轴对齐方式(6)
  20. 『煮酒论史』 [近代风云]外东北、藏南、南沙:如何看待失去的领土

热门文章

  1. Swift封装 滑出式导航栏
  2. 第一个servlet小程序
  3. iOS游戏开发 几个有利工具
  4. 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
  5. 联想ThinkCentre M8400t-n000等高配电脑重装成xp蓝屏0xc000007b代码
  6. C#中跨窗体操作(1)--事件
  7. 【转载】 Asp.net Mvc 3当然也不会例
  8. 急救WINDOWS内存错误
  9. 后端DTO(数据传输对象)与DAO(数据库数据源对象)解耦的好处
  10. vue : 无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确, 然后再试一次。