设计模式:
设计模式是一套被反复使用,多数人知晓的、经过分类编目的、代码设计经验的总结。
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。
单例模式:
目的:使得类的一个对象成为该类系统中的唯一实例。
定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供。
要点:1、某个类只能有一个实例 2、必须自行创建实例 3、必须自行向整个系统提供实例。
实现: 1、只提供私有的构造方法 2、含有一个该类的静态私有对象 3、提供一个静态的公有方法用于创建、获取静态私有对象。
代码实现方案:
1、饿汉式
package com.imooc.singleton;
//饿汉式 :创建对象实例的时候直接初始化
//空间换时间
public class SingletonOne {
// 1、创建类中私有构造
private SingletonOne() {
}
//2、创建该类型的私有静态实例
private static SingletonOne instance = new SingletonOne();
//3、创建公有静态方法返回静态实例对象
public static SingletonOne getInstance() {
return instance;
}
}
2、懒汉式
package com.imooc.singleton;
//懒汉式:类内实例化对象创建时并不直接初始化,直到第一次调用get方法时,才完成初始化操作
//时间换空间
public class SingletonTwo {
//1、创建私有构造方法
private SingletonTwo() {
}
//2、创建静态的该类实例对象
private static SingletonTwo instance = null;
// 3、创建开放的静态方法提供实例对象
public static SingletonTwo getInstance() {
if(instance==null) {
instance = new SingletonTwo();
}
return instance;
}
}
测试:
package com.imooc.test;
import com.imooc.singleton.SingletonOne;
import com.imooc.singleton.SingletonTwo;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
SingletonOne one = SingletonOne.getInstance();
SingletonOne two = SingletonOne.getInstance();
System.out.println(one==two);
System.out.println("============================");
SingletonTwo one1 = SingletonTwo.getInstance();
SingletonTwo two1 = SingletonTwo.getInstance();
System.out.println(one1==two1);
}
}
饿汉式 PK 懒汉式
1、饿汉式在类加载时就创建实例,第一次加载速度快;
懒汉式第一次使用时才进行实例化,第一次加载速度慢。
2、饿汉式线程安全;懒汉式存在线程风险。
单例模式的优缺点
优点:
1、在内存中只有一个对象,节省内存空间。
2、避免频繁的创建销毁对象,提高性能。
3、避免对共享资源的多重占用。
缺点:
1、扩展比较困难。
2、如果实例化后对象长期不使用,系统将默认为垃圾进行回收,会造成对象状态丢失。
单例模式适用场景
1、创建对象时占用资源过多,但同时又需要用到该对象。
2、对系统内资源要求统一读写,如读写配置信息。
3、当多个实例存在可能引起程序罗技错误,如号码生成器。