设计模式分为三类
1.创建型模式(5种)----->用于解决对象创建的过程
单例模式 工厂方法模式 抽象工厂模式 建造者模式 原型模式
2.结构型模式(7种)----->把类或对象通过某种形式结合在一起 构成某种复杂或合理的结构
适配器模式 装饰者模式 代理模式 外观模式 桥接模式 组合模式 享元模式
3.行为型模式(11种)---->用来解决类或对象之间的交互 更合理的优化类或对象之间的关系
观察者模式 策略模式 模板模式 责任链模式 解析器模式 迭代子模式
命令模式 状态模式 备忘录模式 访问者模式 中介者模式
单例模式:
单例模式(Singleton Pattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建,这个类提供了一种访问其唯一对象的方式,可以直接访问,不需要实例化类的对象。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
注意:
- 单例类只能有一个实例;
- 单例类必须自己创建自己的唯一实例;
- 单例类必须给所有其他对象提供这一实例。
单例模式的实现:
1.饿汉式(立即加载,对象启动时就开始加载):
不会产生对象没有就拿来使用的问题 空指针异常
启动项目加载的对象过多 有些还没有使用 产生服务器承载压力的问题
//饿汉式,在第一次调用的时候实例化自己 public class SingleTon { //1.因为共有的 外面可以随意创建镀锡,所以让构造方法变成私有---保证外面不可以随便创建对象 private SingleTon(){} //2.因为单例是单例,而不是无例,所以必须在属性、方法、构造方法、块中创建一个唯一的对象(new一个对象); //属性 //方法------不行 每一次执行都会产生一个过程new一个对象 保证不了唯一 //构造方法--不行 它是私有的 本身就是这个构建过程 //块--------不行 没有返回值 创建了对象也无法给别人使用 //静态元素只加载一次,如果不加,则会出现栈内存溢出 //必须为私有的,防止直接访问 private static SingleTon single = new SingleTon(); //静态工厂方法 //3.提供一个获取单个对象的方法给用户 // 返回值 将对象返回出去 //static 可以直接通过类名访问方法 public static SingleTon getSingleTon(){ return single; } }
public class TestMain {
public static void main(String[] args){
SingleTon s1 = SingleTon.getSingleTon();
SingleTon s2 = SingleTon.getSingleTon();
System.out.println(s1==s2);//true 比较地址
System.out.println(s1.equals(s2));//true Object类继承过来的 默认也比地址
System.out.println(s1);//类全名@hashCode--->16进制的整数
System.out.println(s2);
}
}
2.懒汉式(延迟加载,用到对象才加载):
可能会由于没有操作好 导致异常(很严谨)
启动项目时候只有需要的加载 不需要的还没有创建 不会浪费空间
public class SingleTon { private SingleTon(){} private static SingleTon single = null; public static SingleTon getSingleTon(){ if(single == null) { single = new SingleTon(); } return single; } }