什么是设计模式?
设计模式(Design Pattern)是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结。
目的:提高代码的可重用性,易于被他人理解,可靠性高。
基本的模式有23种,常见的有5种:
- 单例模式
- 抽象工厂模式
- 建造者模式
- 工厂模式
- 原型模式
单例模式
什么情况下用单例模式呢?有些对象我们只需要一个,比如,配置文件,工具类,线程池,缓存,日志对象等。如果创造出了多个实例,就会导致许多问题,比如占用资源过多,不一致的结果。
单例模式,可以保证整个应用中某个实例有且只有一个。
单例模式有两种实现方式
- 饿汉实现
- 懒汉实现
饿汉实现
Singleton.java
package com.dulu;
public class Singleton {
/**
* 单例模式Singleton
* 饿汉模式
* 应用场景 :有些对象只需要一个就足够了
*
* 饿汉模式和懒汉模式的区别:
* 饿汉模式 :在加载类时比较慢,但在运行时获取对象的速度比较快,线程安全
* 懒汉模式 :在加载类时比较快,但在运行时获取对象的速度比较慢,线程不安全
*/
// 将构造方法私有化,不允许外部直接创建对象
private Singleton(){
}
// 在类的内部创建类的唯一实例,并将它定义为类的成员,
// 这样才能通过类名.属性名得到这个实例
// 方法1 static Singleton instance = new Singleton();
// 方法2 使用private static修饰
private static Singleton instance = new Singleton();
//这里的创建实例的代码在Singleton类被加载时执行 所以称为:饿汉模式
/*
* 方法2的内容 提供一个获取实例的方法,供外部调用这个方法
* 使用public static修饰
* 不写static的时候它是对象 设置为static使它成为类方法,变成类所有的方法
*/
public static Singleton getInstance(){
return instance;
}
}
懒汉实现
Singleton2.java
package com.dulu;
/**
* 懒汉模式
*/
public class Singleton2 {
// 1 将构造方法私有化,不允许外部直接创建对象
private Singleton2(){
}
/**
* 2 声明类的唯一实例 只声明,不实例化
* 当类加载时,并不实例化类,
* 当在用户获取的时候,才去判断是否存在实例,
* 为空时,才去创建这个实例
*/
private static Singleton2 instance;
// 3 向外部提供一个获取实例的方法
public static Singleton2 getInstance(){
if(instance==null){
instance = new Singleton2();
}
return instance;
/**
* 第一次获取实例时,不存在实例,所有会创建一个实例
* 以后再获取时,因为已经存在这个实例,所以直接返回该实例
*/
}
}
测试文件
Test.java
package com.dulu;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
/**
* 饿汉模式的测试
*/
// 方法1 Singleton s1 = Singleton.instance;
// Singleton s2 = Singleton.instance;
// 方法2
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("s3和s4是同一个实例");
}else{
System.out.println("s3和s4不是是同一个实例");
}
}
}
结果:
s1和s2是同一个实例
s3和s4是同一个实例