几种单例模式的写法

方法一:

public class Singleton1 {
    private Singleton1(){
        System.out.print("Singleton1 created");
    }
    private static Singleton1 instance = new Singleton1();
    public static Singleton1 getInstance(){
        return instance;
    }
    public static void createString(){
        System.out.print("String created");
    }
}

当使用Singleton.createString()时执行结果如下:

Singleton created
String created

虽然并没有使用单例类,但还是被加载出来了。为了解决这个问题我们引入方法二。

方法二:

public class Singleton2 {
    private Singleton2(){
        System.out.print("Singleton2 created");
    }
    private static Singleton2 instance = null;
    public static sychronized Singleton2 getInstance(){
        if (install == null){
            instance = new Singleton2();
        }
        return instance;
    }
}

第二种方法使用了同步关键字,实现了延迟加载功能,但是由于同步关键字是不允许多个线程同事访问被sychronized修饰的代码,所以可想而知在多线程的项目中他的效率还不如方法一(此处可以自己验证)。

方法三:

public class Singleton3 {
    private Singleton(){
        System.out.print("Singleton3 created");
    }
    private static class SingletonHolder {
        private static Singleton3 instance = new Singleton3();
    }
    public static Singleton3 getInstance() {
        return SingletonHolder.instance;
    }
}

在Singleton3中,单例模式使用内部类来维护单例的实例,当Singleton3被加载时,其内部类不会被加载,而当getInstance方法调用时,才会加载SingletonHolder类,保证了延迟加载的功能。

时间: 2024-08-05 20:03:30

几种单例模式的写法的相关文章

iOS开发笔记-两种单例模式的写法

iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" static ServiceManager *defaultManager; @implementation ServiceManager +(ServiceManager *)defaultManager{ if(!defaultManager) defaultManager=[[self allocWith

两种单例模式的写法

iOS的单例模式有两种官方写法,如下: (1)不使用GCD #import "ServiceManager.h" static ServiceManager *defaultManager; @implementation ServiceManager +(ServiceManager *)defaultManager{ if(!defaultManager) defaultManager=[[self allocWithZone:NULL] init]; return default

8种单例模式写法助你搞定面试

1. 单例模式常见问题 为什么要有单例模式 单例模式是一种设计模式,它限制了实例化一个对象的行为,始终至多只有一个实例.当只需要一个对象来协调整个系统的操作时,这种模式就非常有用.它描述了如何解决重复出现的设计问题, 比如我们项目中的配置工具类,日志工具类等等. 如何设计单例模式 ? 1.单例类如何控制其实例化 2.如何确保只有一个实例 通过一下措施解决这些问题: private构造函数,类的实例话不对外开放,由自己内部来完成这个操作,确保永远不会从类外部实例化类,避免外部随意new出来新的实例

设计模式:单例模式的写法(基础写法和线程安全写法)

单例模式的写法非常多.先给出一种最基础的写法: (A种写法): package singleton; public class SingletonInstance { private static SingletonInstance mSingletonInstance = null; // 特意将构造函数设置成 private,防止外部使用者new SingletonInstance(). private SingletonInstance() { } public static Single

Java中的五种单例模式实现方法

[代码] Java中的五种单例模式实现方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 package s

几种单例模式实现方式及其优缺点分析

什么是单例模式 确保一个类只有一个实例,也就是类有且仅有一个对象,并且提供一个全局的访问点,外部通过这个访问点来访问该类的唯一实例 单例模式的特点 单例类只能有一个实例: 单例类必须自己创建自己的唯一实例: 单例类必须给所有其他对象提供这一实例. 几种常见的单例模式 单例模式的写法有好几种,这里主要介绍四种:懒汉式单例.饿汉式单例.登记式单例.枚举式单例 懒汉式单例 不着急实例化,需要用的时候才初始化 原始式 public class Singleton { private Singleton(

五种单例模式

今天算是完完整整把老高的单例模式看了,差不多也懂了,个别不懂的再补吧,下面介绍一下5种单例模式: 饿汉式实现:线程安全,调用效率高.但是,不能延时加载. 懒汉式实现:线程安全,调用效率不高.但是,可以延时加载. 双重检测锁式:由于JVM底层内部模型原因,偶尔会出现问题,不建议使用. 静态内部类式:线程安全,调用效率高,可以延时加载. 枚举式:线程安全,调用效率高.但是,不能延时加载(避免反射和反序列化的漏洞). 以下先介绍一下5种单例模式: 饿汉式实现: /** *单例模式:饿汉模式 *线程安全

7、java实现的两种单例模式

/* 两种单例模式的演示 */ //饿汉式 class Signal { private Signal(){} private Signal s = new Signal(); public static Signal getInstance() { return s; } } //懒汉式 class Signal { private Signal(){} private Signal s = null; public static Signal getInstance() { if(s ==

两种sql的写法的比较

SUM(p.payable - p.single_price) AS profitCount, m.order_id AS orderId, m.create_time, m.dept_airport_code, m.arrv_airport_code, m.payable AS price FROM om_passenger p, om_order m WHERE p.order_id = m.order_id AND p.ticket_status = '1' AND m.create_ty