欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

写一个单例模式示例

发布时间:2024/3/24 编程问答 52 豆豆
生活随笔 收集整理的这篇文章主要介绍了 写一个单例模式示例 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

*写一个单例模式示例

*要点
*1.某个类只能有一个实例

  • 构造器私有化

*2.它必须自行创建这个实例

  • 含有一个该类的静态变量来保存这个唯一的实例

*3.它必须自行向整个系统提供这个实例

  • 对外提供获取该实例的方式:1.直接暴露2.用静态变量的get方法获取

*几种常见形式
*饿汉式:
在类初始化时直接创建对象,不管是否需要这个对象都会创建,
不存在线程安全问题

  • 直接实例化饿汉式(简洁直观)public static final SingletonDemo INSTANSE=new SingletonDemo();private SingletonDemo() {}
  • 枚举式(最简洁)枚举类型:标识该实例的对象是有限几个,我们可以定为一个,就成了单例public enum Singleton2{INSTANCE}
  • 静态代码块饿汉式(适合复杂实例化)public static final SingletonDemo INSTANCE;static {INSTANCE=new SingletonDemo();}private SingletonDemo() { }

*懒汉式:
延迟创建对象

  • 线程不安全(适用与单线程)
  • 线程安全(适用于多线程)
  • 静态内部类形式(适用于多线程)

懒汉式示例

/** 懒汉式:* 1)构造器私有化* 2)用一个静态变量保存这个唯一的实例* 3)提供一个静态方法,获取这个实例对象*/class SingletonDemo {/** 线程不安全(适用与单线程)* private static SingletonDemo INSTANCE;private SingletonDemo(){ }public static SingletonDemo getINSTANCE() {if(INSTANCE==null) {INSTANCE=new SingletonDemo();}return INSTANCE;}*//*** // 线程安全(适用于多线程)private static SingletonDemo INSTANCE;private SingletonDemo(){ }public static SingletonDemo getINSTANCE() {if(INSTANCE==null) {synchronized (SingletonDemo.class) {if (INSTANCE == null) {INSTANCE = new SingletonDemo();}}}return INSTANCE;} *//** 静态内部类形式(适用于多线程)* 在内部类被加载和初始化时,才创INSTANCE对象* 静态内部类不会自动随着外部类的加载和初始化而初始化,它是要单独加载和初始化的* 因为是在内部类加载和初始化时创建的,因此线程是安全的*/private SingletonDemo() {}private static class Inner{private static final SingletonDemo INSTANCE=new SingletonDemo();}public static SingletonDemo getInstance() {return Inner.INSTANCE;} }public class SingletonTest{public static void main(String[] args) {SingletonDemo s1=SingletonDemo.getInstance();SingletonDemo s2=SingletonDemo.getInstance();System.out.println(s1==s2);System.out.println(s1);System.out.println(s2);} }

static的作用:

1.修饰成员变量给变量加上static关键字后,变量变为全局变量*JVM在加载时会将此变量加载到方法区而不是堆里 2.修饰成员方法可以使用 类名.方法名 操作方法 不需要在new出对象 3.静态代码块当new出一个对象后,static修饰的成员变量首先被初始化随后是普通成员,最后是构造方法,*在程序运行的过程中,static只会在第一次new时被初始化 4.静态导包 5.代码块静态块最先执行,其次时普通代码块,再是构造方法

final的用法:

1.用在类上表示该类不可以被继承 2.用在方法上表示该方法不可以被重写(override) 3.用在变量上表示 该变量一旦被赋值 值不能被改变

static修饰的属性强调它们只有一个,final修饰的属性表明
是一个常数(创建后不能被修改)。static final修饰的属性
表示一旦给值,就不可修改,并且可以通过类名访问。

总结

以上是生活随笔为你收集整理的写一个单例模式示例的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。