java 3种单例模式
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种单例模式相关推荐
- java两种绑定方式_java两种单例模式用法分析
本文实例讲述了java两种单例模式用法.分享给大家供大家参考,具体如下: 按照加载方式的不同,单例模式有两种实现: private:只能在同一个类中使用 static:该类是类方法,不能调用实例方法. ...
- Java设计模式之单例模式(七种写法)
Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton {private static Singleton ...
- java 23种设计模式 04 单例模式
java 23种设计模式 04 单例模式 一.什么是单例模式 单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象.也就是说,在整个程序空间中,该类只存在一个实例对象. ...
- Java单例模式详解--七种单例模式实现+单例安全+实际应用场景
单例模式 保证了一个类只有一个实例,并且提供了一个全局访问点.单例模式的主要作用是节省公共资源,方便控制,避免多个实例造成的问题. 实现单例模式的三点: 私有构造函数 私有静态变量维护对象实例 公有静 ...
- java中的单例_细说Java中的几种单例模式
在Java中,单例模式分为很多种,本人所了解的单例模式有以下几种,如有不全还请大家留言指点: 饿汉式 懒汉式/Double check(双重检索) 静态内部类 枚举单例 一.饿汉式 image 饿汉式 ...
- java中的7种单例模式
java中的7种单例模式 单例模式是我们开发中经常会用到的,单例模式的好处是应用在运行时只有一个实例,生命周期从单例实例化后一直到应用生命周期结束.这里总结和比较一下几种单例的形式,共总结了七种. 写 ...
- 【面试系列】6种单例模式(Singleton)实现方法比较
转载文章,文章经 LiteCodes 授权,转载至本博客. 原文地址:[面试系列]6种单例模式(Singleton)实现方法比较 下述代码均省略了 Singleton 类的业务代码段,仅表现作为单例所 ...
- Java中的单例模式
2019独角兽企业重金招聘Python工程师标准>>> 最近网上查找资料做了一下总结,Java中的单例模式主要是有以下两种实现方式: 1.public class Singleton ...
- 在Java中实现单例模式的有效方法是什么? [关闭]
在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...
最新文章
- 重磅 | MIT启动IQ计划:研究人类智能,让全世界的机构共同合作
- 系统内存信息获取工具类
- 通过jS打包下载图片
- Hibernate关联映射-数据对象三种关系
- 工作68:子路由跳转
- android中给TextView或者Button的文字添加阴影效果
- 移植的7zip到Vxworks 取名vx7zip
- android h5链接蓝牙,h5+runtime Native.js 混合APP连接蓝牙打印机
- MIT6.830 Lab3 Query Optimization 实验报告
- linux 子进程exit6,linux 惊群有关问题
- java访问网络接口_Java网络访问 java调用http java调用其他接口
- [团队项目]英语学习助手之 NABC 模型
- mysql 联合主键自增,mysql联合主键自增、主键最大长度小记
- PHP下载远程图片的3个方法
- Python中的enumerate用法
- 制售《原神》外挂非法获利200万,外挂的危害有多大?
- 文件底层I/O基本操作——东写西读南开北关中位移_莫韵乐的Linux英雄传
- matlab中欠定方程组超定方程组_学会这些三元一次方程组的解法思路与运用,初中不再怕解方程...
- VUE-flex布局之align-content多交叉轴对齐方式(6)
- 『煮酒论史』 [近代风云]外东北、藏南、南沙:如何看待失去的领土
热门文章
- Swift封装 滑出式导航栏
- 第一个servlet小程序
- iOS游戏开发 几个有利工具
- 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
- 联想ThinkCentre M8400t-n000等高配电脑重装成xp蓝屏0xc000007b代码
- C#中跨窗体操作(1)--事件
- 【转载】 Asp.net Mvc 3当然也不会例
- 急救WINDOWS内存错误
- 后端DTO(数据传输对象)与DAO(数据库数据源对象)解耦的好处
- vue : 无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确, 然后再试一次。