懒汉模式/饿汉模式--Java实现

本文详细解析了懒汉式与饿汉式单例模式的实现方式及特点。懒汉模式在需要时创建实例,适用于资源占用大的场景;饿汉模式则在程序启动时即创建实例,确保实例始终存在。两者均遵循单例模式的三个要素:构造方法私有化、静态属性指向实例、静态方法返回实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

懒汉式+单例模式

package com.fgy.entity;

/**
 * 懒汉+单例模式
 * 
 * 懒汉模式:
 * 程序启动时不创建实例,等到需要时再创建
 * 
 * 单例模式三要素:
 * 1.构造方法私有化->使得外部无法通过new实例化对象
 * 2.静态属性指向实例
 * 3.静态方法返回第2点的静态属性
 * 
 * @author fgy_
 *
 */
public class AppleSloth  {
	
	
	//私有化构造方法
	private AppleSloth() {
		System.out.println("实例化了一个Apple");
	} 
	//静态属性指向实例
	private static AppleSloth apple;
	//静态方法返回Apple实例
	public static AppleSloth getInstance()
	{
		//保证该类只有一个实例
		if(null!=apple) {
			return apple;
		}else
		{
			apple = new AppleSloth();
			return apple;
		}
	}
}

测试:

package com.fgy.test;

import com.fgy.entity.AppleSloth;
import com.fgy.entity.BananaHungry;

public class FruitTest {

	public static void main(String[] args) {
		
		AppleSloth apple1 = AppleSloth.getInstance();
		
		AppleSloth apple2 = AppleSloth.getInstance();
		
		System.out.println("饿汉式:apple1==apple2  "+(apple1==apple2));
		
		/*
		 * BananaHungry bananaHungry1 = BananaHungry.getInstance();
		 * 
		 * BananaHungry bananaHungry2 = BananaHungry.getInstance();
		 * 
		 * System.out.println("懒汉式:bananaHungry1==bananaHungry2  "+(bananaHungry1==
		 * bananaHungry2));
		 */
	}

}

结果:两次获取实例,只创建一个实例

控制台输出:
实例化了一个Apple
饿汉式:apple1==apple2 true

饿汉式+单例模式

package com.fgy.entity;

/**
 * 饿汉式+单例模式
 * 
 * 饿汉模式:
 * 程序启动时就创建实例,不管是否需要
 * 
 * 单例模式三要素
 * 1.构造方法私有化
 * 2.声明类唯一实例,private static修饰
 * 3.提供获取实例的公有、静态的方法
 * @author fgy_
 *
 */
public class BananaHungry {
	
	private static BananaHungry bananaHungry = new BananaHungry();
	
	private BananaHungry() {
		System.out.println("实例化了一个Banana");
	}
	
	public static BananaHungry getInstance()
	{
		return bananaHungry;
	}

}

测试:

package com.fgy.test;

import com.fgy.entity.AppleSloth;
import com.fgy.entity.BananaHungry;

public class FruitTest {

	public static void main(String[] args) {

		/*
		 * AppleSloth apple1 = AppleSloth.getInstance();
		 * 
		 * AppleSloth apple2 = AppleSloth.getInstance();
		 * 
		 * System.out.println("饿汉式:apple1==apple2  " + (apple1 == apple2));
		 */
		
		 BananaHungry bananaHungry1 = BananaHungry.getInstance();
		  
		 BananaHungry bananaHungry2 = BananaHungry.getInstance();
		 
		 System.out.println("懒汉式:bananaHungry1==bananaHungry2  "+(bananaHungry1==bananaHungry2));
		 
	}

}

结果:
两次获取的实例是同一个,只调用一次构造方法

控制台输出:
实例化了一个Banana懒汉式: bananaHungry1==bananaHungry2 true

线程安全
懒汉式单例模式时非线程安全的,使用时需注意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值