Java设计模式-单例模式(Singleton)
来源:互联网 发布:mac outlook 离线文件 编辑:程序博客网 时间:2024/04/30 02:59
目的:
确保一个类只能实例化一个对象,并提供一个全局访问点。什么时候用:
- 一个类只实例化一个对象时。
典型使用:
- 日志类
- 管理数据库连接
- IO,文件操作
实际的例子:
- java.lang.Runtime#getRuntime()
示例代码:
- 线程安全(在定义变量instance时初始化)
public class EagerlySingleton { //单例类private static EagerlySingleton instance = new EagerlySingleton();private EagerlySingleton() {}public static EagerlySingleton getInstance() {return instance;}}
public class App{ //测试public static void main(String[] args) {EagerlySingleton eSingleton1 = EagerlySingleton.getInstance();EagerlySingleton eSingleton2 = EagerlySingleton.getInstance();System.out.println("eSingleton1=" + eSingleton1);System.out.println("eSingleton2=" + eSingleton2);}}输出:
eSingleton1=EagerlySingleton@487f6155eSingleton2=EagerlySingleton@487f6155
- 线程安全
public class LazySingleton {private static LazySingleton instance = null;private LazySingleton() {}public synchronized static LazySingleton getInstance() { //synchronizedif (instance == null) {instance = new LazySingleton();}return instance;}}
- Enum
public enum EnumSingleton { INSTANCE; @Override public String toString() { return getDeclaringClass().getCanonicalName() + "@" + hashCode(); }}
<pre name="code" class="java">public class App {public static void main(String[] args) {EnumSingleton enumSingleton1 = EnumSingleton.INSTANCE;EnumSingleton enumSingleton2 = EnumSingleton.INSTANCE;System.out.println("enumSingleton1=" + enumSingleton1); // enumSingleton1=EnumSingleton@298792720System.out.println("enumSingleton2=" + enumSingleton2); // enumSingleton2=EnumSingleton@298792720<span style="white-space:pre"></span>}}
- Serializable
import java.io.Serializable;public class InitializingOnDemandHolderIdiom implements Serializable{private static final long serialVersionUID = 1L;private static class HelperHolder {public static final InitializingOnDemandHolderIdiom INSTANCE = new InitializingOnDemandHolderIdiom();}public static InitializingOnDemandHolderIdiom getInstance() {return HelperHolder.INSTANCE;}private InitializingOnDemandHolderIdiom() {}protected Object readResolve() {return getInstance();}}
public class App {public static void main(String[] args) {InitializingOnDemandHolderIdiom demandHolderIdiom = InitializingOnDemandHolderIdiom.getInstance();System.out.println(demandHolderIdiom);<span style="white-space:pre"></span> //InitializingOnDemandHolderIdiom@528f2588InitializingOnDemandHolderIdiom demandHolderIdiom2 = InitializingOnDemandHolderIdiom.getInstance();System.out.println(demandHolderIdiom2); //InitializingOnDemandHolderIdiom@528f2588<span style="white-space:pre"></span>}}
- Double check locking
public class DoubleCheckLocking {private static volatile DoubleCheckLocking INSTANCE;private DoubleCheckLocking() {//反射if(INSTANCE != null)throw new IllegalStateException("initialized.");}public static DoubleCheckLocking getInstance() { DoubleCheckLocking result = INSTANCE;if (result == null) {synchronized (DoubleCheckLocking.class) {result = INSTANCE;if (result == null) {INSTANCE = result = new DoubleCheckLocking();}}}return result;}}
public class App {public static void main(String[] args) {DoubleCheckLocking dcl1 = DoubleCheckLocking.getInstance();System.out.println(dcl1); //DoubleCheckLocking@487f6155DoubleCheckLocking dcl2 = DoubleCheckLocking.getInstance();System.out.println(dcl2); //DoubleCheckLocking@487f6155}}
@斗大的熊猫
import java.io.Serializable;public class InitializingOnDemandHolderIdiom implements Serializable{private static final long serialVersionUID = 1L;private static class HelperHolder {public static final InitializingOnDemandHolderIdiom INSTANCE = new InitializingOnDemandHolderIdiom();}public static InitializingOnDemandHolderIdiom getInstance() {return HelperHolder.INSTANCE;}private InitializingOnDemandHolderIdiom() {}protected Object readResolve() {return getInstance();}}
public class App {public static void main(String[] args) {InitializingOnDemandHolderIdiom demandHolderIdiom = InitializingOnDemandHolderIdiom.getInstance();System.out.println(demandHolderIdiom);<span style="white-space:pre"></span> //InitializingOnDemandHolderIdiom@528f2588InitializingOnDemandHolderIdiom demandHolderIdiom2 = InitializingOnDemandHolderIdiom.getInstance();System.out.println(demandHolderIdiom2); //InitializingOnDemandHolderIdiom@528f2588<span style="white-space:pre"></span>}}
- Double check locking
public class DoubleCheckLocking {private static volatile DoubleCheckLocking INSTANCE;private DoubleCheckLocking() {//反射if(INSTANCE != null)throw new IllegalStateException("initialized.");}public static DoubleCheckLocking getInstance() { DoubleCheckLocking result = INSTANCE;if (result == null) {synchronized (DoubleCheckLocking.class) {result = INSTANCE;if (result == null) {INSTANCE = result = new DoubleCheckLocking();}}}return result;}}
public class App {public static void main(String[] args) {DoubleCheckLocking dcl1 = DoubleCheckLocking.getInstance();System.out.println(dcl1); //DoubleCheckLocking@487f6155DoubleCheckLocking dcl2 = DoubleCheckLocking.getInstance();System.out.println(dcl2); //DoubleCheckLocking@487f6155}}
@斗大的熊猫
public class DoubleCheckLocking {private static volatile DoubleCheckLocking INSTANCE;private DoubleCheckLocking() {//反射if(INSTANCE != null)throw new IllegalStateException("initialized.");}public static DoubleCheckLocking getInstance() { DoubleCheckLocking result = INSTANCE;if (result == null) {synchronized (DoubleCheckLocking.class) {result = INSTANCE;if (result == null) {INSTANCE = result = new DoubleCheckLocking();}}}return result;}}
public class App {public static void main(String[] args) {DoubleCheckLocking dcl1 = DoubleCheckLocking.getInstance();System.out.println(dcl1); //DoubleCheckLocking@487f6155DoubleCheckLocking dcl2 = DoubleCheckLocking.getInstance();System.out.println(dcl2); //DoubleCheckLocking@487f6155}}
@斗大的熊猫
0 0
- JAVA设计模式:单例(Singleton)
- 【Java】单例(singleton)设计模式
- JAVA设计模式:单例(Singleton)
- Java设计模式之单例模式(singleton模式)
- java设计模式之单例模式(Singleton模式)
- Java设计模式之单例模式(singleton模式)
- java设计模式---singleton---单例模式
- Java设计模式----------单例模式(Singleton)
- Java设计模式--单例模式(Singleton)
- Java设计模式 单例模式(Singleton)
- Java设计模式--单例(Singleton)模式
- Java设计模式----单例模式(Singleton)
- Java设计模式 - 单例模式(Singleton)
- java设计模式--Singleton单例模式
- Java设计模式---Singleton单例模式
- Java设计设计模式之单例模式(Singleton)
- java设计模式(一):Singleton(单例模式)
- java设计模式(4):单例模式(Singleton)
- HDU - 1754 - I Hate It (线段树 - 区间最值)
- Perl 在指定字符行下追加
- 马士兵谈面试
- Cookie笔记
- 火狐关闭多个标签不要显示警告
- Java设计模式-单例模式(Singleton)
- test
- ffmpeg分离ts为h264、aac
- Android利用sharedpreferences缓存对象和数组数据与文件传输
- java.lang.IllegalArgumentException: you must specify a way to create the tab content
- jQuery搜索插件auntocomplete
- 深入理解PHP中赋值与引用
- 个人网站建立过程中遇到的问题
- java也谈gc