单列java_Java中的单列模式是什么?又该怎么用?

本文详细介绍了Java中的单例模式,包括饿汉式、懒汉式、静态内部类式和枚举式的实现方式,以及它们各自的线程安全性和性能特点。单例模式用于确保类只有一个实例,常用于资源管理。文章总结了各种实现方式的适用场景,如饿汉式适用于资源占用少,不需要延迟加载的情况;而静态内部类和枚举方式在保证线程安全的同时提供了更好的性能和懒加载特性。
摘要由CSDN通过智能技术生成

什么是单例模式?

单例模式是指,采用某种手段或者方法,保证整个软件系统中只能存在一个对象的实例,并且该实例只提供创建该对象的方法。

使用情况及优缺点

使用情况:当您想控制实例数目,节省系统资源的时候,和一个全局使用的类频繁地创建与销毁的时候

优点:节省系统资源的开销,避免内存的重复使用

缺点:没有接口,不能继承

单例模式的例子

饿汉式

package com.cn.cmc.javadesignstyle;

public class SingletonDemo {

//获取一个单例的实例

public static void main(String[] args) {

Singleton singleton1 = Singleton.getInstance() ;

Singleton singleton2 = Singleton.getInstance() ;

System.out.println(singleton1 == singleton2);

singleton1.claim();

}

}

/**

* 单例模式:程序运行中只能存在一个对象的实例

*

* 设计步骤:1. 将构造器私有化,保证外部不能创建

* 2. 初始化实例

* 3. 私有化实例,向外界提供一个返回实例的接口

* 4. 次公共方法必须通过类来调用static

*/

class Singleton{

//将构造器私有化

private Singleton(){

}

//在内部初始化一个实例

//恶汉模式:在初始化类的时候直接实例化对象

private static Singleton singleton = new Singleton() ;

//懒汉模式:初始化时候不新建对象,在具体用到的时候在实例化

private static Singleton singleton2 = null ;

//向外部提供一个返回实例方法

//饿汉

public static Singleton getInstance() {

return singleton;

}

}

懒汉式

package com.cn.cmc.javadesignstyle;

public class SingletonDemo {

//获取一个单例的实例

public static void main(String[] args) {

Singleton singleton1 = Singleton.getInstance() ;

Singleton singleton2 = Singleton.getInstance() ;

System.out.println(singleton1 == singleton2);

singleton1.claim();

}

}

/**

* 单例模式:程序运行中只能存在一个对象的实例

*

* 设计步骤:1. 将构造器私有化,保证外部不能创建

* 2. 初始化实例

* 3. 私有化实例,向外界提供一个返回实例的接口

* 4. 次公共方法必须通过类来调用static

*/

class Singleton{

//将构造器私有化

private Singleton(){

}

//在内部初始化一个实例

//懒汉模式:初始化时候不新建对象,在具体用到的时候在实例化

private static Singleton singleton2 = null ;

//向外部提供一个返回实例方法

public synchronized static Singleton getInstance2(){

if(singleton2 == null){

singleton2 = new Singleton() ;

}

return singleton2 ;

}

}

注:使用懒汉模式时要注意线程安全问题,需要使用synchronized来控制进入创建实例方法的线程

静态内部类式

package com.cn.cmc.javadesignstyle;

public class SingletonDemo {

//获取一个单例的实例

public static void main(String[] args) {

Singleton singleton1 = Singleton.getInstance() ;

Singleton singleton2 = Singleton.getInstance() ;

System.out.println(singleton1 == singleton2);

}

}

/**

* 单例模式:程序运行中只能存在一个对象的实例

*

* 设计步骤:1. 将构造器私有化,保证外部不能创建

* 2. 初始化实例

* 3. 私有化实例,向外界提供一个返回实例的接口

* 4. 次公共方法必须通过类来调用static

*/

class Singleton{

//将构造器私有化

private Singleton(){

}

//静态内部类方式,在第一次使用时才会加载

private static class SingletonClassInstance{

private static final Singleton instance = new Singleton() ;

}

public static Singleton getInstance(){

return SingletonClassInstance.instance ;

}

}

枚举式

package com.cn.cmc.javadesignstyle;

public class SingletonDemo {

//获取一个单例的实例

public static void main(String[] args) {

Singleton singleton1 = Singleton.INSTANCE ;

Singleton singleton2 = Singleton.INSTANCE ;

System.out.println(singleton1 == singleton2);

}

}

/**

* 单例模式:程序运行中只能存在一个对象的实例

*

* 设计步骤:1. 将构造器私有化,保证外部不能创建

* 2. 初始化实例

* 3. 私有化实例,向外界提供一个返回实例的接口

* 4. 次公共方法必须通过类来调用static

*/

enum Singleton{

//枚举类本身就是单例

INSTANCE ;

//相关操作

public void operator(){

System.out.println("操作...");

}

}

单例模式总结

饿汉式自身线程安全,调用高效但不支持延迟加载

懒汉式需要synchronized保证线程安全,支持懒加载但调用低效

静态内部类方式自身线程安全,支持懒加载且效率高效

枚举式自身线程安全,编写方便效率高效但不支持懒加载

选用时:若占用资源少,不需要懒加载,枚举式好于饿汉式

若占用资源多,需要懒加载时,静态内部类式要好于懒汉式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值