java设计模式:单例模式
设计模式是什么?
设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
设计模式最经常被使用的,比较重要的就是单例模式、抽象工厂模式、工厂模式以及代理模式。
这一篇主要写的是设计模式的单例模式:
单例模式:只允许被实例化出来一个对象,即内存只存在一个类的对象,就叫做单例模式。
将一个类的构造方法设置为私有的,然后对外提供一个公共的可以调用该类私有构造方法的接口方法。‘
其实单例模式就是限制外部类不能随意访问本类里边的的构造方法,从而实现外部类不能够随意实例化本类对象的目的, 则一个类要调用单例模式的话,就需要将该类的构造方法设计为私有的,为了让外部类可以实例化出来一个该类的对象,就需要给外部类提供一个可以访问到本类私有构造方法的对外方法。
单例模式的应用体现:电脑的任务栏,只能创建一个,当有一个任务栏时,再创建仍是展示之前的任务栏。
单例模式的设计分两种:
饿汉模式
懒汉模式
/** * 饿汉式设计模式 * 在类加载的时候,就将类的对象实例化出来,放在内存里,在用户使用的时候直接调用 * 特点: * 因为在类加载的时候,就已经实例化了对象,所以内存里会一直有这个对象,占用内存空间, * 同样因为已经实例化了对象,所以调用时不需要在创建对象,所以效率较高点。 */ public class HungryDemo { /*static修饰为全局变量,在内存中只存在一个该变量的对象*/ private static HungryDemo hungryDemo = new HungryDemo(); private HungryDemo(){} /*对外提供该类对象的接口*/ public static HungryDemo getBean() { return hungryDemo; } }
/** * 懒汉式单例模式 * 在类被加载的时候,没有实例化对象,当用户需要使用对象的时候,才实例化对象 * 特点: * 在类被加载的时候,内存里没有该类的对象,所以会节省内存空间, * 但是当用户使用的时候,因为还需要先去实例化对象,所以效率相对而言低 */ public class StarvingDemo { /*创建一个全局变量赋值为空*/ private static StarvingDemo s = null; private StarvingDemo() { } public static StarvingDemo getBean() { /*判断对象是否被实例化,如果已经实例化,就返回该对象,否则就实例化对象*/ if (s != null) { System.out.println("对象已经被实例化"); return s; } return s= new StarvingDemo(); } }
测试创建对象是否为单例对象:
public class Demo1 { public static void main(String[] args) { HungryDemo bean = HungryDemo.getBean(); HungryDemo bean1 = HungryDemo.getBean(); System.out.println(bean == bean1); StarvingDemo bean2 = StarvingDemo.getBean(); StarvingDemo bean3 = StarvingDemo.getBean(); System.out.println(bean2 == bean3); } }
单例模式的应用场景:
1.在应用场景中,某类对象只要求生成一个对象的时候,如:任务管理器,聊天窗口,office文件等。
2.当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。如web中的配置对象,数据库的连接池等。
3.当某类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池,网络连接池等。