单例模式的深刻理解及最优法例子

 懂的越多,发现所知越少。是时候丰富下基础知识了,以下也是网上归纳总结的知识点。主要归纳几点

第一:单例模式概念;第二:单例模式的特点及核心知识;第三:最优法单例模式例子;第四:使用单例和不使用单例模式 到底有什么区别(代码举例)


一、单例模式的概念:指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点。(百度)

二、单例模式的特点:

    1、单例类只能有一个实例。
  2、单例类必须自己自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。

  单例模式shou的核心知识:

 (1) 将采用单例设计模式的类的构造方法私有化(采用private修饰)。

 (2) 在其内部产生该类的实例化对象,并将其封装成private static类型。

 (3) 定义一个静态方法返回该类的实例。

三、单例模式最优方案例子

package com.test.api;

/**  
 * 方法四
 * 单例模式最优方案
 * 线程安全  并且效率高  
 *  
 */  
public class SingletonTest { 
	// 定义一个私有构造方法
    private SingletonTest() { 
     
    }   
    //定义一个静态私有变量(不初始化,不使用final关键字,使用volatile保证了多线程访问时instance变量的可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用)
    private static volatile SingletonTest instance;  

    //定义一个共有的静态方法,返回该类型实例
    public static SingletonTest getIstance(String str) { 
        // 对象实例化时与否判断(不使用同步代码块,instance不等于null时,直接返回对象,提高运行效率)
        if (instance == null) {
            //同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建)
            synchronized (SingletonTest.class) {
                //未初始化,则初始instance变量
                if (instance == null) {
                    instance = new SingletonTest();   
                }   
            }   
        }   
        return instance;   
    }   
}
四、使用单例和不使用单例模式 到底有什么区别(代码举例)

=======================首先,先看看平常我们写的代码(不使用单例模式)

实体类:

public class NotSingletonTest {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	public void Test(){
		System.out.println("this is "+name);
	}

}
测试类:

public static void main(String[] args) {

		NotSingletonTest not1 = new NotSingletonTest();
		NotSingletonTest not2 =  new NotSingletonTest();;
		not1.setName("1");
		not2.setName("2");

		not1.Test();
		not2.Test();

		if(not1==not2){
			System.out.println("same instance2");
		}else if(not1 != not2){
			System.out.println("different instance2");
		}
	}
最后输出的是  :

this is 1
this is 2

different instance2

===============然后,我们再看使用单例模式会有什么效果
实体类:

package com.test.api;

/**  
 * 方法四
 * 单例模式最优方案
 * 线程安全  并且效率高  
 *  
 */  
public class SingletonTest { 
 private String name;
 
    public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
	// 定义一个私有构造方法
    private SingletonTest() { 
     
    }   
    //定义一个静态私有变量(不初始化,不使用final关键字,使用volatile保证了多线程访问时instance变量的可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用)
    private static volatile SingletonTest instance;  

    //定义一个共有的静态方法,返回该类型实例
    public static SingletonTest getIstance(String str) { 
        // 对象实例化时与否判断(不使用同步代码块,instance不等于null时,直接返回对象,提高运行效率)
        if (instance == null) {
            //同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建)
            synchronized (SingletonTest.class) {
                //未初始化,则初始instance变量
                if (instance == null) {
                    instance = new SingletonTest();   
                }   
            }   
        }   
        return instance;   
    }   
    public  void Test(){
    	System.out.println("this is "+name);
    } 
}

测试类:

public static void main(String[] args) {

		SingletonTest sin1 = SingletonTest.getIstance("1");
		SingletonTest sin2 = SingletonTest.getIstance("2");

		sin1.setName("1");
		sin2.setName("2");

		sin1.Test();
		sin2.Test();

		if(sin1==sin2){
			System.out.println("same instance1");
		}else if(sin1 != sin2){
			System.out.println("different instance1");
		}

	}
最后输出的是:

this is 2
this is 2
same instance1

 总结: 看出来了吧,使用了单例模式,顾名思义保证调用这个类的时候,只实例化一次。因此输出的都是this is 2

参考原文:

http://blog.sina.com.cn/s/blog_8af106960101ctlq.html

http://www.cnblogs.com/yinxiaoqiexuxing/p/5605338.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值