- 设计模式是一套被反复使用、多数人知晓的经过分类编目的、代码设计经验的总结
- 设计模式是软件开发人员在软件开发中面临的一般问题的解决方案
设计模式:
- 项目中合理的应用设计模式可以完美的解决很多问题
- 每种设计模式在现实中都有相应的原理与之对应
- 每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案
面向对象的设计模式很多(但是基础的有23 种)
创建型设计模式(创建对象)
工厂方法模式
创建者模式
抽象工厂模式
原型模式
单例模式(重点)
现实中的对应的原理:一山不容二虎(指挥官只能有一个)
计算机系统:
- 驱动程序
- 打印机后台处理程序
- 线性池
- 缓存
- 日志
目的: 使得类的一个对象称为该类系统的唯一实例
定义:一个类有且仅有一个实例,并且==自行实例化(调构造方法)==向整个系统提高
两种创建模式
- 饿汉式
- 懒汉式
要点:1.某个类只能有一个实例
2、必须自行创建实例
3.必须自行向整个系统提供这个实例
实例:
1.只提供私有的构造方法
2.含有一个该类的静态私有对象
3.提供一个静态的共有方法用于创建、获取静态私有对象
饿汉 和懒汉:
1.饿汉式在类加载时就创建实例,第一次加载速度快
懒汉在第一次使用时才进行实例化,第一次加载速度慢
饿汉式:空间换时间
懒汉式:时间换空间
2.饿汉式线程安全:懒汉式存在线程风险
解决方案:
1、同步锁
2、双重校验所
3.静态内部类
4.枚举
优点:
- 在内存中只有一个对象,节省内存空间
- 避免重复的创建销毁对象,提高性能
- 避免对共享资源的多重占用
缺点:
- 扩展比较困难
- 如果实例化后的对象长期不用,系统将默认为垃圾进行回收,造成对象状态丢失
适用场景:
- 创建对象时占用资源过多,但同时又需要用到该类对象
- 对系统内资源要求统一读写,如读写配置信息
- 当多个实例存在可能引起程序逻辑错误,如号码生成器
代码实现如下
package org.oracle.singleton;
/*单例模式整个系统有且只有唯一的实列,需要自行实例化向这个系统提供
* 饿汉:创建对象时直接初始化 空间换时间(时间效率高)
*(线程安全)
*
*
* */
public class SingletonOne {
/*将改造方法改为private 限制实例化只能在本类中进行*/
private SingletonOne() {
}
//创建有且唯一的实例
private static SingletonOne singletonOne = new SingletonOne();
//创建getInstance方法获取实例
public static SingletonOne getInstance(){
return singletonOne;
}
}
package org.oracle.singleton;
/*在创建对象时不去实例化,当第一次掉get方法时在实例化对象
*
*懒汉(线程不安全)
* 时间换空间*/
public class SingletonTwo {
//创建私有的构造方法
private SingletonTwo(){
}
private static SingletonTwo singletonTwo;
//创建本类的有且唯一的对象 不初始化,当调用get方法时实例化。并对外提供实例的访问
public static SingletonTwo getInstance(){
if(singletonTwo ==null){
singletonTwo =new SingletonTwo();
}
return singletonTwo;
}
}