day_14 匿名内部类、设计模式
匿名内部类
- 匿名内部类 : 就是没有名字的类
- 一般 方法参数需要接收一个接口类型的数据,那么我们调用的时候需要传入对应 的实现类对象
- 此时 可以直接传递一个匿名内部类 , 匿名内部类 就等于是子类
- 匿名内部类没有名字,不能重复使用 , 类名为 外部类类名$1 . 以此类推
- 匿名内部类中 不能有静态声明,但是可以声明常量(public static final)
- 不能直接调用外部类的成员属性,需要用对象 才行
public class OuterClass {
public static void main(String[] args) {
int i = 2;
System.out.println(i);
//UserServiceImpl userServiceImpl = new UserServiceImpl();
// m1(userService);
// 匿名内部类
m1(new UserService() {
@Override
public void login() {
System.out.println("登陆失败");
}
});
}
public static void m1(UserService userService){
userService.login();
}
}
//定义user服务接口类,接口不能创建对象,所有需要实现类
interface UserService{
public void login();
}
//userService接口实现类
class UserServiceImpl implements UserService{
@Override
public void login() {
System.out.println("登录成功了");
}
}
设计模式
- 什么是设计模式 : 设计模式 代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。
- 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案
- 这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
1.单例模式
-
单例模式 : 让某个类只创建一个对象,可以避免垃圾回收问题,
-
例如Windows中的任务管理器,只能打开一个,打开多了造成资源浪费
-
实现方式 :
-
1 实例化对象,需要调用构造方法,想要控制创建对象的数量,
-
第一步就是不能让别的人创建对象,就意味着不能让别的类访问构造方法
-
构造方法私有化
-
2 提供一个用于获取当前类对象的静态方法
-
上面已经把构造方法私有化了,用户创建不了对象了,那么我们需要提供一个方法用于获取对象,那么该方法一定是公共的静态方法, 如果是成员方法,必须得现有对象才能调用,而该方法就是用来获取对象的
-
想要获取对象,必须先提供静态方法
-
3 保证只有一个实例
-
数据不存储不能重复使用,所以为了保证对象的唯一性,必须先准备一个 变量用于存储这个对象
-
变量声明 : 数据类型 变量名 = 值; 值 就是对象_______变量名 无所谓
-
数据类型 SingLeton_01 当前**类类型**
-
如果是成员变量 : 必须用对象调用,在静态方法中不能直接使用,而我们的方法是静态方法,所以不能直接操作成员变量
-
如果是局部变量 : 方法执行完,就销毁,每次调用该方法的时候,变量重新执行初始化一次,导致创建多个对象
-
如果是静态变量 : 整个程序生命周期中,只会初始化一次
单例模式
-
1 构造方法私有化
-
2 提供一个静态变量用来保存类对象
-
3 提供一个静态方法,用来获取当前类对象
-
根据对象的创建时机不同,分为两类
-
1 饿汉模式 : 类加载完之后,就立刻创建对象
public class SingLeton_01 {
private SingLeton_01(){
}
static SingLeton_01 s = new SingLeton_01();
public static SingLeton_01 getInstance(){
return s;
}
}
//饿汉模式类加载时创建对象
- 2 懒汉模式 : 第一次用到的时候 在创建对象
public class SingLeton_02 {
// 1 构造方法私有化
private SingLeton_02() {
}
// 2 静态变量
private static SingLeton_02 s;
// 3 静态方法
public static SingLeton_02 getInstance() {
if (s == null) {
s = new SingLeton_02();
}
return s;
}
}
工厂模式
把实例化对象的语句,单独放到工厂类中,负责创建对象
这样我们用到这个对象的时候,只需要去工厂中获取即可,使类和类之间的依赖关系变弱,耦合度降低
public class Factory_01 {
public static void main(String[] args) {
Animal a = Factory.getAnimal(1);
Animal b = Factory.getAnimal(2);
}
}
class Animal {
}
class Cat extends Animal {
}
class Dog extends Animal {
}
class Pig extends Animal {
}
class Factory {
public static Animal getAnimal(int x) {
if (x == 1) {
return new Cat();
} else if (x == 2) {
// return new Dog();
return new Pig();
}
return null;
}
}