N.2 单例模式
1)在软件运行过程中会创建很多对象,有些对象的创建非常的消耗资源,并且只需要一个。这种情况就可以使用单例模式。单例就是单个实例。一个类只能创建一个对象。将构造器设为私有,并在加载类的时候创建一个对象,让这个对象被重复引用。 2)当类被加载时,静态的变量会被加载的时候执行(所以通过这点优势,在类加载的时候创建对象,同时将构造方法进行私有化,防止别的类在次创建)。 3)每个类只会加载一次,所有能保证创建唯一的对象,但静态方法在加载的时候是不会执行,只能被调用执行。 |
N.2.1 class加载过程
1)先加载父类静态变量(包括“静态代码块”static{ },加载会执行。但静态方法不会执行,static void name(){} 只能被mian方法调用)后执行子类。 2)非静态变量和方法,随着对象的存在而存在随着的对象的消亡而消亡。 (1)比如在main方法外面创建对象,不用static修饰,这个对象是不会被加载的,也就是没有创建成功。 |
N.2.2 jvm运行过程
1)执行main方法,其它的方法使用就看main的方法体有没有进行调用。 不可以在main方法的外面调用方法,只能在main的方法体里面进行调用。 2)在main方法内外创建同一个对象是允许的,可以把它们认为是基本类型,只是作用域不同。 (1)如果是全局作用域可以在任何地方被修改,如果存在相同名的全局变量和域局部变量,就使用的是最近的变量,它们两个互不相干。 |
class SingletonDemo { //当类被加载时,创建一个实例 //由于每个类只会加载一次,所有能保证创建唯一的对象,但静态方法在加载的时候是不会执行,只能被调用执行//创建私有对象 private static SingletonDemo instance = new SingletonDemo (); //私有的构造方法 private SingletonDemo() { } //返回类型为SingletonDemo public static SingletonDemo getInstance(){ return instance; } } class test{ public static void main (String[] args) { // SingletonDemo sl = new SingletonDemo(); // SingletonDemo s2 = new SingletonDemoC); SingletonDemo s1 = SingletonDemo.getInstance (); SingletonDemo s2 = SingletonDemo. getInstance (); System.out. println (s1 == s2);//true } } |
N.3 代理模式
N.3.1 静态代理
————————————————————————
————————————————————————
1)代理模式可以在不改变源代码的情况下对目标对象进行访问控制和功能扩展。 (1)目标对象(RealSubject)是实际完成功能的对象。 (2)代理对象(Proxy)是目标对象的替身,用户和RealSubject的交互必须通过Proxy。 (3)案例 去4s店保养车辆,客户经理是代理对象,技术工人是目标对象。 先跟客户经理交互,确认保养的内容。然后客户经理会将保养车辆的工作交给技术工人完成。当实际工作完成后,再跟客户经理确认并付款。 2)步骤 (1)代理对象完成前置工作。 (2)目标对象完成实际工作。 (3)代理对象完成后置工作。 可以是123。12或23也符和生活逻辑。 |
//接口描述了对外提供的功能 interface Subject{ //修车的工作 void work(); } //实际工作人员 class RealSubject implements Subject { @Override public void work(){ System. out.println("RealSubject work"); } } class SimpleProxy implements Subject { //代理对象 持有目标对象的引用 //声明变量名为realSubject (自定义) //类型为接口(作用就是可实现多态,面向接口的好处就是随时可以切换实现类) private Subject realSubject; // 也可以使用Subject[] real=new Subject[3];一个代理可以代理多个商家。所以这里用数组表示 //然后通过数组下标确定某个对象 //代理的构造方法 public SimpleProxy() { //创建实际工作人员对象 realSubject = new RealSubject(); } @Override public void work() { System.out.println("before RealSubject work");//前置工作 realSubject.work();//实际工作委托给目标对象(实际工作人员)完成 System.out.println("after RealSubject work");//后置工作 } } class client{ public static void main(String[] args){ //UserManager userManager=new UserManagerImpl(); Subject proxy = new SimpleProxy(); proxy.work(); } } |
3)Proxy和RealSubject都实现了Subject接口的work()方法, 4)在Proxy里负责创建自己和实际技术人员的对象。 5)面向接口的好处就是随时可以切换实现类。 (1)这样用户不管对代理说,还是对实际技术人员说,保养车辆,他们都有一致的话语,都能回应客户能工作。这样用户就可以像处理RealSubject一样处理Proxy对象。 (2)用户与RealSubject的交互都必须通过Proxy。任何用到RealSubject的地方,都可以用Proxy取代。 (3)RealSubject是真正做事的对象,Proxy可以对RealSubject进行访问控制和功能扩展。 (4)创建RealSubject对象,通常由Proxy负责。 (5)Proxy持有对RealSubject的引用,所以必要时可以将请求转发给RealSubject。 |
N.3.2 动态代理
————————————————————————
————————————————————————