什么是单例模式?
单例类确保只有一个实例,也就是我们不能像往常使用类一样创建多个实列
单例类自动创建属于自己的唯一实例
单例类需要给其他对象调用自身实例的方法
单例类与普通类的区别:单例类只有一个实例,只创建一次一直储存在内存上没有被销毁,每次使用单例类用的都是同一个实例。普通类在每次要使用时创建在不适用时自动销毁。单例类只有一个
实例他无法被多个对象同时访问,而普通类可以创建多个实例可以多个对象访问不同的实例。
如何创建单例类?(以饿汉式为例)
上图单例类,将类的实例存储在一个静态字段里面,并且私有化构造函数使其无法被在其他位置被实例,通过静态的特点只在类加载时加载(只加载一次),在加载类时就完成了对自身的实例并且存储在字段中,并且给了一个方法返回该字段(实例),并且该方法为静态使其无需实例就可调用。
访问顺序:外部调用获取实例的静态方法,返回实例,在调用实例。(返回的实例永远是同一个)
单例类的使用示例
假如我要记录一个网站的访问量,我先示范单例如何实现。
在上面的示例单例类中我写了一个计算值和一个计数方法。
只要客户每次浏览我就执行CingletonPattern.getInstance().autoIncrement();
完成计数。
而普通类方法需要每次都要实例类(传递计数值)在调用类进行计算在储存计数值。
同时会出现一个问题,假如有5个人同时访问每一个人都传递一个计数值实例了类进行计算加1,由于同时执行,大家传递的计数值都相同,也就是说在同一时间无论你多少人在访问,都只是记录一个人,其他人记录不了。而单例模式完美的解决了这个问题,他只有一个实例无法被同时访问调用,即使同一时间多个请求调用,他们会自动进行排队,一个一个执行,完整的记录每一个人。
总结
单例类的实例一直存储在内存中,普通类则是用则实例不用则自动销毁。
频繁的创建实例销毁实例大大影响系统运行速度。
所以在遇到一些频繁调用的类可以考虑使用单例加强性能。
计数方面尽量使用单例。同理在文件操作方面也尽量使用单例。
Window系统是多线程的,如果多个线程同时操作同一文件会出现操作重复等一系列问题。