一、什么是单例设计模式
设计模式就是在大量的实践中总结和理论化优选的代码结构、编程风格、以及解决问题的思考方式。简而言之,就是在实际编程中,总结出的一些解决问题的套路。
单例指只有一个实例。
而所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍然可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。
二、单例设计模式-饿汉式
package day14; /** * 饿汉式的单例模式 * * */ public class Single { // public Single(){ // //假设构造中要执行1000行代码,要占用很大的资源,耗时很长(10s) // //每一次new Single对象需要10s,运行1000行代码 // //像这种情况,就适合使用单例模式,只new一次对象,以后一直就使用这个对象 // } //先做私有的构造,构造方法私有化,调用这个类的人就不能直接使用new来创建对象 private Single(){ } //私有的Single类型的类变量 private static Single single = new Single();//single是私有的类变量,在整个代码运行中只有一份,因此new Single()只new了一次,赋给了single对象 public static Single getInstance(){//不管调用多少次getInstance方法,都返回给single对象 return single; } }
package day14; public class Test { public static void main(String[] args){ Single s = Single.getInstance(); Single s1 = Single.getInstance(); Single s2 = Single.getInstance(); Single s3 = Single.getInstance(); Single s4 = Single.getInstance();//不管调用多少次getInstance方法,都返回给single对象 } }
三、单例设计模式-懒汉式.
最开始,对象是null,直到有第一个人调用我,才new一个对象,之后所有调用我的都用这个对象。
package day14; /** * 懒汉式的单例模式 * * */ public class Single1 { //1.先私有化构造方法,让外部不能直接new对象 private Single1(){ } //2.先声明类的引用 private static Single1 s1 = null;//此处需要配合static方法,用static修饰此类的引用 //3.设置公共的方法来访问类的实例 public static Single1 getInstance(){ if(s1 == null){ s1 = new Single1();//3.1如果类的实例未创建,那么要先创建,然后返回给调用者:本类。 } return s1;//3.2若有了类的实例,直接返回给调用者。 } }
package day14; public class Test { public static void main(String[] args){ Single1 s = Single1.getInstance();//s指向s1,s1本来是null,第一次调用getInstance()方法后,s1变成了new Single1() Single1 s1 = Single1.getInstance();//而s1-s4也都指向s1,s1此时已经变成new Single()对象,因此if语句不执行了,直接返回s1。 Single1 s2 = Single1.getInstance(); Single1 s3 = Single1.getInstance(); Single1 s4 = Single1.getInstance(); } }
总结:单例模式,就是软件运行有且仅有一个实例化对象,也就意味着只会new一次。
而懒汉式和饿汉式的区别就是什么时候new这个对象:
懒汉式,是在第一次有人调用getInstance()方法时来new对象,以后再有人调用getInstance()方法直接就返回第一次new好的对象。
饿汉式,是在类加载之后,还没有人调用的时候,就先new好一个对象,以后不论谁来调用getInstance()方法,都是直接返回之前new好的那个对象。
四、理解main方法的语法
public static void main(String[] args){}
由于Java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public。又因为Java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的,可以用类名.方法直接调用。因为没有返回值,所以用void。而main是方法名。(String[] args)是形参,main方法接收一个String类型的数组参数,该数组中保存执行Java命令时传递给所运行的类的参数。
使用cmd运行来理解:
public class TestMain { public static void main(String[] args){ for(int i = 0; i<args.length; i++){ System.out.println(args[i]); } } }
放到cmd中运行并添加参数,结果为: