设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的,经过分类编目的、代码设计经验的总结。
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。
项目中合理的运用设计模式可以完美解决很多问题。
每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案。
面向对象的设计模式有很多,但这23种是其它模式的基础。
单例模式(Singleton)
定义:
一个类有且仅有一个实例,并且自行实例化向整个系统提供。
目的:
使得类的一个对象成为该类系统中的唯一实例。
优点:
- 在内存中只有一个对象,节省内存空间。
- 避免频繁的创建销毁对象,提高性能。
- 避免对共享资源的多重占用。
缺点:
- 扩展比较困难
- 如果实例化 后的对象长期不利用,系统将默认为垃圾进行回收,造成对象状态丢失。
要点
- 某个类只能有一个实例。
- 必须自行创建实例。
- 必须自行向整个系统提供这个实例。
适用场景
- 创建对象时占用资源过多,但同时又需要用到该类对象。
- 对系统内资源要求统一读写,如读写配置信息。
- 当多个实例存在可能引起程序逻辑错误,如号码生成器
实现
1.只提供私有的构造方法。
2.含有一个该类的静态私有对象。
3.提供一个静态的公有方法用于创建、获取静态私有对象。
代码实现方案
懒汉式和饿汉式
1、饿汉式在类加载时就创建,第一次加载速度快;空间换时间
懒汉式在第一次使用时才进行实例化,第一次加载速度慢。时间换空间
2、饿汉式线程安全;懒汉式存在线程风险。
解决方案:同步锁、双重校验锁、静态内部类、枚举。
// 饿汉式
public class SingletonOne {
//1、创建类中私有构造
private SingletonOne(){}
//2、创建该类的私有静态实例
private static SingletonOne instance = new SingletonOne();
// 3、创建共有静态方法返回静态实例对象
public static SingletonOne getInstance(){
return instance;
}
}
//懒汉式
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;
}
}