目录
1.单例模式
2.工厂模式
3.代理模式
一.单例模式
1.模式的目的:保证一个类在整个程序中,有且仅有一个实例,让我们创建的对象指向的都是同一个
2.两种经典的单例模式:饿汉式和懒汉式
(一)饿汉式:顾名思义,在类开始加载的时候就创建实例,不过可能会造成浪费


这里会相应的输出true。
我们现在对左边代码进行一下理解【有大量对基础知识的解释】
第一段:【private static Singleton singleton=new Singleton();】这里的变量用private修饰的目的是让外部无法改变这个变量(就是重新给它赋值),然后static是为了让变量始终是同一个,所以这段代码总结下来就是在程序开始执行的时候就new了一个固定的singleton对象在Singleton类里,并且不能修改,拿到的始终的都是它
第二段:private修饰的一个构造方法,它的目的是让用户无法创建新的对象,实现单例
(1)在这我一开始产生了一个误区:第二段的目的是让用户无法创建新的对象,但第一段中static修饰的变量不是让它始终都指向的同一个,我就算new了很多个不应该都指向的同一个。
对于这个误会的解释:如果不用private修饰的话,可以new很多对象,每new一个新对象会在堆上创建一个新的,并且就可以直接指向这个新的,如下有一个比较好的例子
把这个类想象成一个工厂:
-
static singleton是工厂仓库里提前放好的 “唯一指定产品” -
new Singleton()是直接开了一条新生产线,造了一个全新的产品
小总结:所以private修饰是为了只有一条生产线,再结合static就可以指向唯一的一个
我们可以通过代码一起很好的对此进行理解【我们在Singleton类里新增一个方法,来拿到创建对象的地址,可以发现这两个通过private构造方法拿到的都指向同一个】



【我们现在去掉private修饰的构造方法,不自己创建构造方法,使用Java默认给的】


通过代码可以清晰的看到没有private修饰的构造方法的后果,也只有s1是拿到了方法里static修饰的变量
第三段:提供了一个用static修饰的getSingleton方法,这里static的作用有两个,第一就是为了在类外拿到这个静态对象,因为private的构造方法让外部无法创建对象,static修饰后可以通过方法名来创建对象,第二就是静态方法只能访问静态对象,这样单例模式就完美形成了闭环。
(二).懒汉式:特点:用到时才创建(懒加载),但多线程下会创建多个实例


在你通过getInstance方法构造了对象前会先判断这个变量之前有没有被创建过,如果被创建了就会返回之前创建的变量,来实现单例
二.工厂模式
(1).在使用工厂模式前我们需要抽象产品,具体的产品,抽象工厂,具体工厂
(2).工厂模式的好处:我们无需记住复杂的类名,我们只需要通过自己创建的类名来点出我们想要的类,并且不需要new很多对象出来,下面我来用不同身份的例子来展示一下








三:代理模式
Java 中代理分为 静态代理 和 动态代理,我们以静态代理为例
作用:为一个对象提供一个代理对象,由代理对象控制对原对象的访问,且不修改原对象代码,就能对原功能进行增强。



我们在AdminUser和NormalUser类里面分别加上加图书和借阅图书的方法,并且创建一个代理类ProxyUser,在这个类里面可以验证传入user的类型来调用对应的方法,也可以在这个类里面加上一些改错的方法等,类似于ProxyUser类在对另外两个类进行代理
2174



被折叠的 条评论
为什么被折叠?



