Java基础复习:单例模式

来源:互联网 发布:深圳奥萨制药 知乎 编辑:程序博客网 时间:2024/05/01 02:47

目的:采取一定的方法,保证整个应用中对某个类有且只有一个对象实例,所有指向该类型实例的应用都指向这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。

如果要让类在一个虚拟机中只能产生一个对象,首先必须将雷的构造方法的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部人可以产生该类的对象。

因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。


懒汉式单例:

它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。

//懒汉式,线程不安全的class Singleton2{private static Singleton2 instance = null;public static Singleton2 getInstance(){if(instance == null){instance = new Singleton2();}return instance;}private Singleton2(){}}public class SingletonDemo {public static void main(String[] args) {Singleton2 s3 = Singleton2.getInstance();Singleton2 s4 = Singleton2.getInstance();System.out.println(s3 == s4);//true}}


饿汉式单例:(推荐使用)

它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。

//饿汉式class Singleton{private static final Singleton instance;static{instance = new Singleton(); }public static Singleton getInstance(){return instance;}//把构造方法私有化,不允许外界再创建对象private Singleton(){}}public class SingletonDemo {public static void main(String[] args) {Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();System.out.println(s1 == s2);//true}}


此外,还可以使用枚举来实现单例模式。

使用枚举来实现单例模式的好处是这样非常简洁,并且无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。——《Effective Java》

public enum Singleton {    INSTANCE;//唯一实例    public static Singleton getInstance(){        return INSTANCE;    }    public void show(){System.out.println("使用enum实现单例模式");    }}


原创粉丝点击