JAVA04-单例设计模式与组合设计模式

设计模式之单例模式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
  /**
 * 单例设计模式之饿汉式
 * 1. 私有化构造器
 * 2. 提供实例常量
 * 3. 提供工厂方法getInstance方法返回实例常量
 */
public class World {
    private static final World SINGLETON_INSTANCE = new World();

    public static World getInstance() {
        return SINGLETON_INSTANCE;
    }

    private World() {
    }
}

设计模式之组合模式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  class AClass {
    public void hello() {
        System.out.println("Hello");
    }
}

class BClass {
    public void world() {
        System.out.println("World");
    }
}

/**
 * 现在我们想拥有这A,B这两个类的方法该怎么办呢? 又不能同时继承两个类
 * 答: 我们可以使用组合设计模式
 * 1. 将目标类放入成员变量
 * 2. 转发请求
 */
class CClass {
    AClass aClass = new AClass();
    BClass bClass = new BClass();

    public void hello() {
        aClass.hello(); // 转发请求
    }

    public void world() {
        bClass.world(); // 转发请求
    }
}

需要注意的点

  1. 在使用继承时,总是应该先考虑是否使用组合,继承是 is-a 的关系, 组合是 has-a 的关系

向上/向下转型

  1. 一个子类类型的对象永远是一个父类类型的对象
  2. instanceof 可以判断一个对象是不是指定类的实例
  3. 当你需要一个父类对象的时候,你总是可以传递一个子类对象给它,它会发生自动向上转型
  4. 当你需要一个子类对象的时候,你不一定能够传递父类对象,要看这个对象是不是该子类对象的实例,并且你需要强制类型转换,向下转型是不安全的

final

  1. final可以修饰变量,变量只能被赋值一次,它是线程安全的
  2. final可以修饰对象,对象的地址不能改变,但对象的数据是可以改变的
  3. final可以修饰参数
  4. final可以修饰方法,该方法将不能被覆盖
  5. final还可以修饰类,被修饰类不能被继承
updatedupdated2025-03-012025-03-01