单例模式(单子模式)
一、什么是单例模式?
在我们的Java应用程序中,随着应用程序的运行会创建出很多对象。但有时候我们希望在创建某类对象时,无论创建多少次该类对象只有一份在内存中。这就是单例模式。如果我们要实现单例模式首先要保证构造函数私有化,即不允许用户随意调用我本类的构造函数,因为只要通过new操作创建对象,必定要在堆中开辟空间,这样就无法实现单例了。
单例类有如下特点:
§ 单例类只有一个实例。
§ 单例类自行创建并提供这个唯一的实例。
单例模式有以下的特点:
§ 单例类只能有一个实例。
§ 单例类必须自己创建自己的惟一的实例。
§ 单例类必须给所有其他对象提供这一实例。
二、单例模式的实现
第一种实现方式:
- /**
- * 单例模式(饿汉式单例类) 从速度和反应时间角度来讲,饿汉式单例类稍好
- * @author Administrator
- *
- */
- public class Singleton {
- private static Singleton singleton = new Singleton();
- private String value;
- //构造方法要私有
- private Singleton(){
- }
- //提供一个对外的方法
- public static Singleton getSingleton(){
- return singleton;
- }
- public String getValue() {
- return value;
- }
- public void setValue(String value) {
- this.value = value;
- }
- }
第二种实现方法
- /**
- * 单例模式(懒汉式单例类) 单从资源利用效率角度来讲, 懒汉式单例类好些
- * @author Administrator
- *
- */
- public class Singleton2 {
- private static Singleton2 singleton = null;
- private String value;
- //构造方法要私有
- private Singleton2(){
- }
- //提供一个对外的方法
- public static Singleton2 getInstance(){
- if(singleton == null){
- singleton = new Singleton2();
- }
- return singleton;
- }
- public String getValue() {
- return value;
- }
- public void setValue(String value) {
- this.value = value;
- }
- }
测试类:
- public class Test {
- public static void main(String[] args) {
- Singleton s1 = Singleton.getSingleton();
- Singleton2 s2 = Singleton2.getInstance();
- System.out.println(s1.equals(s2));
- s1.setValue("100");
- s2.setValue("200");
- System.out.println(s1.getValue());
- }
- }