You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何避免单例模式?6个类单次实例化及依赖实现方案咨询

嘿,这个需求其实用**依赖注入(Dependency Injection)**的思路就能完美解决,完全不用单例模式,还能清晰管控每个对象的实例化次数和依赖关系。我给你拆解下具体怎么实现:

核心思路

我们不在类内部自行创建依赖对象,而是在应用的统一入口(比如主函数)集中创建所有实例,再把每个类需要的依赖通过构造函数传递进去。这样既能严格控制每个类只实例化一次,还能解耦类之间的依赖关系,比单例模式更灵活、更易维护。

具体实现步骤
  1. 给每个类定义带依赖参数的构造函数:比如Server1的构造函数接收A对象,Server2的构造函数接收A、B、C、Server1对象;A/B/C的构造函数接收Info对象。
  2. 按照你要求的顺序在入口处创建实例:
    • 第一步:创建Info实例,完成文件读取操作
    • 第二步:用Info实例创建A、B、C的实例
    • 第三步:用A实例创建Server1
    • 第四步:用A、B、C、Server1实例创建Server2
代码示例(以Java为例,其他语言逻辑完全一致)

首先定义各个类:

// Info类:负责读取系统信息
public class Info {
    public Info() {
        // 这里写从文件读取系统信息的逻辑
        System.out.println("Info已完成系统信息读取");
    }
    // 可以添加读取到的信息字段和get方法
}

// A类:依赖Info
public class A {
    private final Info systemInfo;
    
    public A(Info systemInfo) {
        this.systemInfo = systemInfo;
        System.out.println("A实例已创建");
    }
    // A的业务方法
}

// B类:依赖Info
public class B {
    private final Info systemInfo;
    
    public B(Info systemInfo) {
        this.systemInfo = systemInfo;
        System.out.println("B实例已创建");
    }
    // B的业务方法
}

// C类:依赖Info
public class C {
    private final Info systemInfo;
    
    public C(Info systemInfo) {
        this.systemInfo = systemInfo;
        System.out.println("C实例已创建");
    }
    // C的业务方法
}

// Server1类:依赖A
public class Server1 {
    private final A aInstance;
    
    public Server1(A aInstance) {
        this.aInstance = aInstance;
        System.out.println("Server1实例已创建");
    }
    // Server1的业务方法
}

// Server2类:依赖A、B、C、Server1
public class Server2 {
    private final A aInstance;
    private final B bInstance;
    private final C cInstance;
    private final Server1 server1;
    
    public Server2(A aInstance, B bInstance, C cInstance, Server1 server1) {
        this.aInstance = aInstance;
        this.bInstance = bInstance;
        this.cInstance = cInstance;
        this.server1 = server1;
        System.out.println("Server2实例已创建");
    }
    // Server2的业务方法
}

然后在应用入口统一创建所有实例:

public class AppEntry {
    public static void main(String[] args) {
        // 1. 先创建Info对象,完成文件读取
        Info systemInfo = new Info();
        
        // 2. 基于Info创建A、B、C
        A a = new A(systemInfo);
        B b = new B(systemInfo);
        C c = new C(systemInfo);
        
        // 3. 创建Server1,传入依赖的A对象
        Server1 server1 = new Server1(a);
        
        // 4. 创建Server2,传入所有依赖的对象
        Server2 server2 = new Server2(a, b, c, server1);
        
        // 后续可以使用server1和server2处理业务逻辑
    }
}
方案优势
  • 严格保证每个类仅实例化一次:所有实例都在入口处创建,没有重复new的可能
  • 完全规避单例模式的弊端:没有全局状态,类之间耦合度极低,方便单元测试(比如可以传入Mock对象替代真实实例)
  • 完全符合你要求的创建顺序和依赖关系

内容的提问来源于stack exchange,提问作者Venkata Subbarao

火山引擎 最新活动