编写一个单例类
来源:互联网 发布:数据抓取系统 编辑:程序博客网 时间:2024/06/06 11:13
在面试的时候,单例模式是经常被提问到的,编写一个Singleton类,可以更好的向面试官展现出自己对单例模式的理解。下面我列举出四个方式在展示Singleton类
1.简单的方式,但这个有一个缺点,那就是在并发执行时,可能存在多个实例。
1 public class SingletonDemo1 { 2 private static SingletonDemo1 INSTANCE; 3 private SingletonDemo1(){ 4 5 } 6 public static SingletonDemo1 getInstance(){ 7 if(INSTANCE==null){ 8 INSTANCE = new SingletonDemo1(); 9 }10 return INSTANCE;11 }12 }
2.公共域的方式,特点就是简单,缺点就是做不到在返回的过程中做额外的逻辑处理,所以引申出可以用工厂来展示单例模式。
1 public class SingletonDemo2 {2 public static final SingletonDemo2 INSTANCE = new SingletonDemo2();3 private SingletonDemo2(){4 5 }6 7 }
3.工厂化方式,特点是可以在实例过程中添加逻辑。
1 public class SingletonDemo3 { 2 public static final SingletonDemo3 INSTANCE = new SingletonDemo3(); 3 private SingletonDemo3(){ 4 5 } 6 public static SingletonDemo3 getInstance(){ 7 return INSTANCE; 8 } 9 10 }
4.枚举方式,最佳实践,推荐使用,并且他不会存在多个实例化的问题以及反序列化的问题。
1 public enum SingletonDemo4 {2 INSTANCE;3 4 public static void saySomthing(String str){5 System.out.println("hello"+str);6 }7 }
Main方法测试:
1 public class Main { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 System.out.println("SingletonDemo1"+SingletonDemo1.getInstance()); 6 System.out.println("SingletonDemo1"+SingletonDemo1.getInstance()); 7 8 System.out.println("SingletonDemo2"+SingletonDemo2.INSTANCE); 9 System.out.println("SingletonDemo2"+SingletonDemo2.INSTANCE);10 11 System.out.println("SingletonDemo3"+SingletonDemo3.getInstance());12 System.out.println("SingletonDemo3"+SingletonDemo3.getInstance());13 14 System.out.println("SingletonDemo4"+SingletonDemo4.INSTANCE);15 System.out.println("SingletonDemo4"+SingletonDemo4.INSTANCE);16 17 SingletonDemo4.INSTANCE.saySomthing("SingletonDemo4");18 }19 20 }
测试结果输出:通过运行结果可以看到,每个用例都被实例化一次,这就是单例模式的精髓:全局资源共享。
0 0
- 编写一个单例类
- 编写一个javabean
- 编写一个文件补丁
- 编写一个AVS
- 一个星期编写 antenna
- JavaBean编写一个计算器
- 编写一个脚本
- 自己编写一个struts
- 编写一个xml Schema
- xml编写一个文件
- 编写一个守护进程
- 编写一个UNIX文件系统
- 编写一个make
- 编写一个文字游戏
- 编写一个UNIX文件系统
- 编写一个系统调用
- 编写一个程序
- java编写一个进度条
- 通过api获取句柄控制其他窗体
- CEF 加载flash 插件
- UML类图中类与类的四种关系图解
- VS 编译错误【error C4996: 'scanf': This function or variable may be unsafe. 】的解决方案
- 不良资产处置(九):资产证券化在不良资产处置中的应用
- 编写一个单例类
- ARM cortex a 之时钟系统3
- AngularJs ngChange、ngChecked、ngClick、ngDblclick
- Anddroid 需要注意的小知识
- 有没有想过用简单办法拿到某个view的父ViewController
- 并发问题 安全性
- 使用新版Android Studio检测内存泄露和性能
- Python中函数的参数传递与可变长参数
- Vijos P1775 乌龟棋(动态规划,四维)