自己终于还是进入到设计模式这个领域了,比自己想象的快了一些。以前也学过、了解过一些模式,但看了之后又,本科毕业找工作面试的时候会看一下单例(这个最常考),但背过之后又会忘记,完全写不处代码来。后来自己反思了一下,是自己的Java基础不到位,就和高中学数学一样,对于同一个题目,一般学生能找出1一条有用信息,对于优生来说,往往能得到好几个有用的信息,Java也是同样的道理,学习就是要多看(书、优秀的代码)、多练(写代码)、多反思多总结(记笔记,写博客等方式)。
不多废话,进入正题:记得我参加的第一个面试时,面试官说单例模式有7中写法,我当时只知道饿汉式和懒汉时,由于复习的缘故,当时应该是写出来了。不过后来早忘记了。今天我们从修饰符入手,撸一撸单例模式。
如果不熟悉访问修饰的,请看我的这篇文章:https://blog.csdn.net/qq_39767955/article/details/84308856
如果不了解static关键字的,请看https://blog.csdn.net/qq_39767955/article/details/84037383
什么是单例模式?可以这样说,只产生一个对象的方法,叫做单例模式,它的核心是只产生一个实例对象。我们来看第一个例子:
class Soup1{
private Soup1 (){}
public static Soup1 makeSoup(){
return new Soup1();
}
}
有了访问修饰符和static关键字的知识后,这段代码就不难理解了:Soup1类有一个private修饰的默认构造方法(注释1),private意味着只能在这个类里面使用这个构造方法产生一个Soup1对象,所以在其他类中就不能使用Soup1 Soup1Instance = new Soup1()模式来创建对象了;但是Soup1又提供了一个public的、静态的、返回值类型为Soup1的空参方法makeSoup(),由于被static修饰的方法可以在不创建类对象时被调用,这里可以用类去调用Soup1.makeSoup(),这样就返回了一个Soup1实例对象的应用了。
有了以上的知识,我们来看看Soup2类
class Soup2{
private Soup2(){}
private static Soup2 sp = new Soup2();
public static Soup2 getInstance(){
return sp;
}
public void f(){}
}
Soup2类的对象是作为Soup2的一个static private(静态私有)成员而创建的,所以有且只有一个对象,为什么只有一个对象,因为被static修饰了,创建的实例只有一个。
注释1处说明:谁说默认的构造方法就必须是public?只要是空参的构造方法就叫做默认构造方法,如果类没有构造方法,编译器会帮你建一个默认构造器(不带任何参数),如果已经编写了默认构造器,那么就不会再创建它了。(《Java编程思想》第四版,原文122页原话)