我们之前见过很多各式各样的建筑,但是大部分的房子都很相像,而设计每一个房子大概都是一个固定的套路,挖坑啊打地基啊开始垒砖啊等等。设计模式就相当于盖房子,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式共有23种,分为创建型、结构型和行为型,下面先简单介绍创建型模式。
一、创建型模式
对象的创建会消耗掉系统的很多资源,所以单独对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题。创建型模式有单例模式和工厂模式。
二、单例模式Singleton
古代的皇帝、现代的老婆,都是有且只有一个。程序中的配置文件、工具类、线程池、缓存、日志对象等,也都是有且只有一个。如果有多个皇帝、多个老婆可能会出现很大的问题,同理,如果创造出多个实例,就会导致许多问题,比如占用过多资源,出现不一致的结果等。为了保证你的对象有且只有一个,可以使用单例模式。
1.饿汉模式
Singleton1.java:
package com.herry;
/**
* 单例模式Singleton
* 应用场合:有且只有一个就够了
* 作用:保证整个应用程序中某个实例有且只有一个
* 类型:饿汉模式、懒汉模式
* @author haorui
*
*/
public class Singleton1 {
//1.将构造方法私有化,不能让外边直接创建对象
private Singleton1(){
}
//2.声明类的唯一实例,用private static修饰
private static Singleton1 intrance = new Singleton1();
//3.提供一个获取实例的方法,用public static修饰
public static Singleton1 getSingleton1(){
return intrance;
}
}
test.java:
package com.herry;
public class test {
public static void main(String[] args){
//饿汉模式
Singleton1 s1 = Singleton1.getSingleton1();
Singleton1 s2 = Singleton1.getSingleton1();
if(s1==s2){
System.out.println("s1和s2是同一个实例!");
}else{
System.out.println("s1和s2不是同一个实例!");
}
}
}
输出结果:
通过上面的代码我们进行分析,还是首先要明确一下单例模式是为了保证整个应用程序中有且只有一个实例。因此从结果可以看出,这种状态下可以保证创建的实例是同一个实例。那为什么称为“饿汉模式”呢?我们在创建类的唯一实例时,是用private static修饰的。static属于类所有,当一个类运行加载进入内存的时候,首先加载static静态代码块,这样就导致当类被加载时这个实例对象intrance就已经被创建了。后来调用获取实例的方法getSingleton(),返回的就都是那个之前被创建好的实例了。“饿汉模式”可以理解为 它想快速的早些吃饱。
2.懒汉模式
Singleton2.java:
package com.herry;
/**
* 单例模式:懒汉模式
* @author haorui
*
*/
public class Singleton2 {
//1.将构造方法私有化,不能让外边直接创建对象
private Singleton2(){
}
//2.声明类的唯一实例,用private static修饰
private static Singleton2 intrance;
//3.提供一个获取实例的方法,用public static修饰
public static Singleton2 getSingleton2(){
//return intrance; 因为我们之前只进行了声明,若直接返回则为null
if(intrance == null ){
intrance = new Singleton2();
}
return intrance;
}
}
test.java:
//懒汉模式
Singleton2 s3 = Singleton2.getSingleton2();
Singleton2 s4 = Singleton2.getSingleton2();
if(s3==s4){
System.out.println("s3和s4是同一个实例!");
}else{
System.out.println("s3和s4不是同一个实例!");
}
输出结果:
由于我们只是声明了一个类的唯一实例,当类加载的时候没有去获取(创建)那个唯一的实例,而是在获取的时候,先对实例进行判断,若为空才创建。当第一次创建后,后面第二个第三个用getSingleton2()方法再来获取实例的时候,由于已经存在实例了,所以每次返回的都会是同一个实例。这样就是懒汉,比较懒。
3.饿汉与懒汉的区别
饿汉:加载类时比较慢,但运行时获取对象的速度比较快,线程安全。
懒汉:加载类时比较快,但运行时获取对象的速度比较慢,线程不安全。