java入门(二十六) | 设计模式之单例设计
设计模式
软件设计模式又称为设计模式,是一套被反复利用、经过分类的、代码设计经验的总结。
使用设计模式是为了可重用代码,让代码更容易的被人理解,保证代码的可靠性、程序的重用性。
Java中有23种设计模式,常见的设计模式有:单例设计模式、工厂模式、代理模式、策略模式、委托模式、责任链模式等。
1.1 单例设计模式概念
单例模式可以说是大多数开发人员在实际中使用最多的.
常见的Spring默认创建的bean就是单例模式的。
单例模式有很多好处,比如可节约系统内存空间,控制资源的使用。
其中单例模式最重要的是确保对象只有一个。
简单来说,保证一个类在内存中的对象就一个。
RunTime就是典型的单例设计,我们通过对RunTime类的分析,一窥究竟。
1.2 源码解析
/**
* Every Java application has a single instance of class
* <code>Runtime</code> that allows the application to interface with
* the environment in which the application is running. The current
* runtime can be obtained from the <code>getRuntime</code> method.
* <p>
* An application cannot create its own instance of this class.
*
* @author unascribed
* @see java.lang.Runtime#getRuntime()
* @since JDK1.0
*/
RunTime.java
package java.lang;
public class Runtime {
//1、创建静态的全局唯一的对象
private static Runtime currentRuntime = new Runtime();
//2、私有构造方法,不让外部来调用
/** Don"t let anyone else instantiate this class */
private Runtime() {}
//3、通过自定义的静态方法获取实例
public static Runtime getRuntime() {
return currentRuntime;
}
}
1.3 饿汉式
package cn.qile.design;
//测试单例设计模式:减少对象的创建次数,保证整个项目中只有一个类的实例
public class Test1_Singleton {
public static void main(String[] args) {
//TODO 测试真的只有一个对象吗???
Single s = Single.getSingle();
System.out.println(s);//地址值,cn.qile.design.Single@12a3a380
//TODO 测试真的只有一个对象吗???
Single s2 = Single.getSingle();
System.out.println(s2);//地址值,cn.qile.design.Single@12a3a380
// == 默认比较的是对象的地址值,如果地址值相同返回true,也就是同一个对象
// == 比较基本类型数据时,比较的是数据的值。
// == 比较引用类型时,比较的是地址值。
System.out.println(s==s2);//true
}
}
//创建Single类
class Single{
//1、私有化构造方法 -- 目的是不让外界随便new
private Single() {}
//2、在类的内部创建对象
//static是因为getSingle()是静态的 调用的 只能是 静态资源
static private Single s = new Single();
//3、提供供的get(),把创建好的对象,返回调用位置
//static是因为外界new不了了,只能通过类名.调用了
static public Single getSingle(){
return s;
}
}
1.4 懒汉式
package cn.qile.design;
//测试单例设计模式:减少对象的创建次数,保证整个项目中只有一个类的实例
public class Test1_Singleton {
public static void main(String[] args) {
//TODO 测试真的只有一个对象吗???
Single s = Single.getSingle();
System.out.println(s);//地址值,cn.qile.design.Single@12a3a380
//TODO 测试真的只有一个对象吗???
Single s2 = Single.getSingle();
System.out.println(s2);//地址值,cn.qile.design.Single@12a3a380
// == 默认比较的是对象的地址值,如果地址值相同返回true,也就是同一个对象
// == 比较基本类型数据时,比较的是数据的值。
// == 比较引用类型时,比较的是地址值。
System.out.println(s==s2);//true
}
}
//创建Single类
class Single{
//1、私有化构造方法 -- 目的是不让外界随便new
private Single() {}
//2、在类的内部创建对象
//static是因为getSingle()是静态的 调用的 只能是 静态资源
static private Single s = null;
//3、提供供的get(),把创建好的对象,返回调用位置
//static是因为外界new不了了,只能通过类名.调用了
static public Single getSingle(){
//懒汉式:线程安全问题
if(s == null) {
s = new Single();
}
return s;
}
}