2021-07-12 内部类和单例模式

标题@内部类和单利模式

匿名内部类

匿名内部类:在方法的调用的时候,需要传入一个类的对象,这个时候可以直接传入一个匿名内部类
一般该对象是接口的实现类对象,匿名内部类等于是子类,可以使用super等关键字
语法:方法(new 父类/接口(){类体})
匿名内部类,会自动创建一个对象传入
好处少定义一个类,缺点无法重复使用

public class _04_OuterClass {
	public static void main(String[] args) {
		//		UserLoginImpl userLoginImpl = new UserLoginImpl();
		//		test(userLoginImpl);

		//这个内部匿名类能充当接口的对象了
		//接口本身是不能创建对象的

		test(new UserLogin() {
			public void login(String username, String password) {
				if (username.equals("admin")) {
					if (password.equals("root")) {
						System.out.println("成功");
					} else {
						System.out.println("密码不正确");
					}
				} else {
					System.out.println("用户名不正确");
				}
			}
		});
	}

	public static void test(UserLogin userLogin) {
		//接口的的引用类型只有两种
		// null  子类对象
		userLogin.login("admin", "root");
	}
}

interface UserLogin {
	public void login(String username, String password);
}



单例模式

单例模式:
 * 		实例化很多次,得到同一个对象,让某个类只能被实例化一
 * 实现步骤:
 * 		现在需要控制创建对象的数量,只有一个,所以就不能让用户决定创建或者不创建
 * 			1 不能让用户创建对象
 * 				创建对象需要调用构造方法,如果不让用户创建对象,也就意味着不能让用户访问构造方法
 * 				所以 构造方法 需要私有化
 * 			2 我们创建一个给他,并且只创建一次即可
 * 				上面已经把构造方法私有化了,就意味着用户创建不了对象了
 * 				那么这个时候,我们必须提供一个让用户能够获取对象的一个方法
 * 				既然是获取对象的方法,那么这个方法一定是静态方法
 * 			3 存储对象的变量
 * 					变量不存储,不能重复使用,所以为了保证对象只有一个,我们肯定是创建对象之后,进行重复使用
 * 						局部变量:具有临时性,方法执行完后就不存在了,下一次调用方法是时,变量初始化
 * 						成员变量:静态方法中不能操作成员变量
 * 						静态变量:和类相关,和类声明周期一致
 * 					所以应该创建一个用来保存当前类对象的静态变量
 * 总结:
 * 1构造方法私有化
 * 2提供一个私有的静态的用来保存当前类对象的静态变量
 * 3提供一个公共的静态方法,来获取该对象
 * 
 * 根据创建对象的时机不同,分为两种
 * 1 懒汉模式
 * 		用到的时候再创建对象,也就是第一次获取的时候
 * 2 饿汉模式
 * 		类加载 的时候就立刻创建对象
 * 
 * 懒汉模式和饿汉模式的区别:
 * 		1内存角度
 * 			懒汉模式要好一些,用到的时候再创建,一般叫做懒加载/迟加载
 * 			饿汉模式浪费内存,还没用就创建了
 * 		2 线程安全角度
 * 			饿汉模式是再类加载阶段就初始化的,所以再多线程环境下没有问题,因为类只会加载一次
 * 			懒汉模式是再多线程并发性的情况下,就不行了,可能创建多个对象,但是可以通过双重校验枷锁解决
 * 		所以 一般我们使用懒汉模式居多,尽管在多线程下,也使用懒汉模式,使用双重校验枷锁解决并发问题即可

//饿汉
public class Singleton_01 {
	private static Singleton_01 singleton_01 = new Singleton_01();

	private Singleton_01() {
		//private不让用户调用
	}

	public static Singleton_01 getInstance() {
		return singleton_01;
	}
}

//懒汉
public class Singleton_02 {
	private Singleton_02() {

	}

	private static Singleton_02 s;

	public static Singleton_02 getInstance() {
		if (s == null) {
			s = new Singleton_02();
		}
		return s;
	}
}
上一篇:手撕设计模式【深度解析懒汉式单例】


下一篇:设计模式-创建型模式-单例模式-懒汉式