JAVA设计案例(单例)

设计模式之-单例模式

​ 设计模式是软件工程方法迭代多年的研究成果,java中常用设计模式主要包含23中,包括:单例,观察者,适配器,工厂方法,抽象工厂,代理模式,装饰模式,模板方法等;

​ 其中单例模式是一种开发中非常常见模式,指的是在程序运行中对象的获取永远是同一个,比如说一些资源池(常量池,连接池,线程池)一般都是基于单例模式实现,单例模式的实现原理为:

类中构造器必须使用private修饰
类中必须提供一个用户返回当前对象实例的静态方法
类中存在一个静态的变量,类型为当前类型
java中单例模式又分为两种:

1. 饿汉模式

饿汉模式即在类被初始化时就创建一个实例,后续的返回永远是当前实例对象

public class Singleton {

//饿汉模式(以空间换时间)
private static Singleton instance = new Singleton();

private Singleton(){
	
}

public static Singleton getInstance(){
	return instance;
}

}

饿汉模式是一种以空间换取时间的设计,在类初始化时即创建对象,后续无需在耗时创建。
2.懒汉模式

懒汉模式指的是在类初始化时不创建任何实例,在提供的静态方法中判断对象是否存在,若不存在则创建:

public class Singleton2 {

private static Singleton2 instance = null;

private Singleton2(){
	
}

//懒汉模式(以时间换空间)
public static Singleton2 getInstance(){
	if(instance == null){
		instance = new Singleton2();
	}
	return instance;
}

}

懒汉模式是一种以时间换取空间的设计
设计模式参考书籍

《设计模式之禅》

《设计模式》GOF
final关键字

final表示最终的,终极的;final关键字可以用于修饰类,属性,方法:

被final修饰类不允许被继承(断子绝孙类)
被final修饰变量不予许修改(但是被final修饰的变量必须初始化,也可以在构造器初始化)
被final修饰的方法不允许被重写
//final修饰的类不允许被继承
public final class FinalTest {

//final属性一旦初始化则不可修改
final String msg;
//常量
static final int TYPE = 1;

//可以在构造器中初始化final属性
public FinalTest(){
	msg = "hello";
}

public FinalTest(String msg){
	this.msg = msg;
}
//final方法不允许被重写
public final void m(){
	final int i = 10;
}

}

final关键字在定义变量时通常跟static组合为常量

public class Test{
public static final String STATUS_OFF = “off”;
public static final String STATUS_ON = “on”;

public static final int ORDER_UNSINGE =0;
}

### Java 中的模式设计与实现 #### 模式的概念 模式是一种创建型设计模式,它确保某个类只有一个实存在,并提供全局访问点来获取该实。这种模式特别适用于那些只需要一控制中心的应用场景。 #### 实现方式 ##### 饿汉式(Eager Initialization) 饿汉式的优点在于简易懂,在类加载时就完成了初始化工作,因此不存在线程安全问题。 ```java public class EagerInitializedSingleton { private static final EagerInitializedSingleton instance = new EagerInitializedSingleton(); private EagerInitializedSingleton() {} public static EagerInitializedSingleton getInstance() { return instance; } } ``` ##### 懒汉式(Lazy Initialization) 懒汉式是在第一次调用 `getInstance()` 方法时才去创建对象,可以节省资源开销,但是需要考虑多线程环境下的安全性[^2]。 ```java public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; private LazyInitializedSingleton() {} synchronized public static LazyInitializedSingleton getInstance() { if (instance == null) { instance = new LazyInitializedSingleton(); } return instance; } } ``` 为了提高性能并保持线程安全,通常会采用双重校验锁的方式优化懒汉式实现: ```java public class DoubleCheckedLockingSingleton { private volatile static DoubleCheckedLockingSingleton uniqueInstance; private DoubleCheckedLockingSingleton() {} public static DoubleCheckedLockingSingleton getInstance() { if (uniqueInstance == null) { // First check before locking synchronized (DoubleCheckedLockingSingleton.class) { if (uniqueInstance == null) { // Second check after acquiring lock uniqueInstance = new DoubleCheckedLockingSingleton(); } } } return uniqueInstance; } } ``` ##### 枚举类型 枚举类型的实现不仅简洁而且天然具备序列化机制以及防止反序列化的特性,是最推荐的一种实现方法。 ```java public enum EnumSingleton { INSTANCE; public void someMethod(){ } } ``` ##### 内部静态辅助类法(Bill Pugh Singleton Implementation) 这种方法利用了JVM对于内部类加载的特点,既实现了延迟加载又解决了线程同步的问题。 ```java public class BillPughSingleton { private BillPughSingleton(){} private static class SingletonHelper{ private static final BillPughSingleton INSTANCE = new BillPughSingleton(); } public static BillPughSingleton getInstance() { return SingletonHolder.INSTANCE; } } ``` #### 使用案例 `java.lang.Runtime` 是 JDK 自带的一个典型应用子,通过其唯一的运行时表示当前 JVM 的运行状态,并提供了许多有用的工具函数给开发者使用。可以通过 `getRuntime().availableProcessors()` 获取处理器数量等操作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值