【概要】
单例模式在项目设计和开发,以及Spring框架中使用的比较多,通过自己在项目中总结的经验和大家一起分享,希望对大家的学习和项目的设计会有所帮助。
【静态方法】
通过定义private static final service,类加载器加载类的时候开始创建对象,后面程序要是使用对象时直接从内存堆区域获取,定义private Service(){}不能通过new Service()去创建对象,从而实现了对象的第一次初始化,后面调用都是第一次的实例。
public class Service {
private static final Service service = new Service();
private Service(){};
public static Service getInstance(){
return service;
}
}
【单个元素的枚举】
枚举的定义在项目中使用的比较多,列如:字段的状态,可以使用枚举来替代public static final 定义,写起了来比较方便简单,更加明确表示该字段的特性,定义枚举中每个元素都是实例对象,如果将枚举中只定义一个元素,提供公共的方法,就能够实现单例,而且这种方式是最好的也是最简单的
public enum Provider {
INSTANCE;
public void get(){
System.out.println("Apple get menthod.");
}
}
【使用场景】
在一个项目中将一些属性:文件路径,连接数据库的用户名和密码等等其它可能会跟随服务器的不同,需要更改的配置,我们将这样的属性类定义成为一个项目的配置类,这个类只需要在项目启动时实例化一次性,在项目其它业务需要时只要从内存中拿出来,不需要重复在内存中开辟空间,这样可以减少不必要的内存开销,提高程序的性能,尽可能避免出现内存溢出问题(OutofMemoryException), Spring 框架中使用的比较频繁,在Spring配置文件定义一个<bean>时可以通过属性Scope来选择定义的bean是单例(Singleton),原型(Prototype),请求(Request),会话(Session)
单例:只有一个实例对象,需要使用时共享这个对象
原型:可以创建任意一个或者多个对象
请求:对象实例的生命周期在HTTP Request有效,响应后直接销毁对象,释放内存
会话:对象实例的生命周期在HTTP Session有效,Session失效后销毁对象,释放内存