目录:
- 设计模式的理解
- 什么是单例模式
- 单例模式的分类及优缺点
- 两种分类的代码讲解
- 测试及总结
设计模式理解:提高代码复用性、可拓展性。
单例模式:保证整个系统应用中某个对象的创建只有一次,如古代皇帝、老婆,说白了就是提供一个公用、全局的对象访问,并且这个对象只创建一次。说详细点,类的创建一般通过该类构建函数,既然要保证该类的对象只创建一次,那么就必须将该类声明为private,其次要公用的和全局的对象可以创建一个公用(public)、静态(static)全局的方法。但是该类提供的方法去创建实例时可以分为立即创建或者调用时创建,这就引出下面的单例模式分类。
单例模式的分类:单例模式分为两种,一种是饿汉式,另外一种是懒汉式。“饿”即我饿了想立马加饭,换成程序上来讲就是随着类的加载而加载,即类一加载完实例对象随即创建;”懒“则相反由程序需要时调用创建。
代码讲解 —— 饿汉式
- 将构造方法私有化
Public class Singleton{ private Singleton(){ //私有化构建函数,防止外部直接创建对象,即保证对象又该类内部提供。 } }
- 创建类的唯一是咧
private static Singleton instance = new Singleton(); //私有化实例创建,以方法形式提供,static代表全局访问
- 提供一个用于获取实例的方法
public static Singleton getInstance(){//返回实例 return instance; }
-
源码
package com.yj.singleton; /** * 描述:饿汉模式 * 单例模式Singleton * 应用场合:有些对象只需要一个就足够了,如古代皇帝、老婆 * 作用:保证整个应用程序中某个实例有且只有一个 * 类型:饿汉模式、懒汉模式 */ public class Singleton { //1、将构造方法私有化,不允许外部直接创建对象 private Singleton(){ } //2、创建类的唯一实例 private static Singleton instance = new Singleton(); //3、提供一个用于获取是咧的方法 public static Singleton getInstance(){ return instance; } }
代码讲解 —— 懒汉式
1.将构造方法私有化
Public class Singleton2{
private Singleton2(){ //私有化构建函数,防止外部直接创建对象,即保证对象又该类内部提供。
}
}
2.声明类的唯一实例
private static Singleton2 instance;//声明类的唯一实例,注意只是声明并未创建,这是"懒"的体现
3.提供一个用于实例对象的访问方法
public static Singleton2 getinstance(){
if(instance == null){//如果为空,则创建该实例对象
instance = new Singleton2();
}
return instance;//再次访问后不再为空,直接返回之前已创建好的实例对象
}
4.源码
package com.yj.singleton;
/**
* 描述:懒汉模式
* 区别:饿汉模式的特点是加载类时比较慢,但运行时获取对象的速度比较快,线程安全
* 懒汉模式的特点是加载类时比较快,但运行时获取对象的速度比较慢,线程不安全
*/
public class Singleton2 {
//1、将构造方法私有化,不允许外部直接创建对象
private Singleton2(){
}
//2、声明类的唯一实例
private static Singleton2 instance;
//3、提供一个用于获取是咧的方法
public static Singleton2 getInstance(){
if (instance == null){
instance = new Singleton2();
}
return instance;
}
}
测试及总结
package com.yj.singleton;
/** https://www.imooc.com/learn/112
* 单例模式Singleton
* 应用场合:有些对象只需要一个就足够了,如古代皇帝、老婆
* 作用:保证整个应用程序中某个实例有且只有一个
* 类型:饿汉模式、懒汉模式
*/
public class SingletonTest {
public static void main(String [] args){
//饿汉模式
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
if (s1==s2){
System.out.println("s1和s2是同一个实例");
}else {
System.out.println("s1和s2不是同一个实例");
}
//懒汉模式
Singleton2 s3 = Singleton2.getInstance();
Singleton2 s4 = Singleton2.getInstance();
if (s3==s4){
System.out.println("s1和s2是同一个实例");
}else {
System.out.println("s1和s2不是同一个实例");
}
}
}
输出:
s1和s2是同一个实例
s1和s2是同一个实例