You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在应用中共享指定类实例?需创建多实例无法使用Singleton

解决方案:同时支持多实例创建与单一实例共享的实现方式

不用死磕单例模式,有几种实用方案能满足你的需求——既能创建目标类的多个独立实例,又能让其中一个实例在全应用内共享、修改状态:

方法一:依赖注入(DI)容器托管共享实例

把需要共享的实例在DI容器里注册为容器级单例,注意这不是类本身的单例限制,类仍然可以通过new创建全新实例。业务代码需要共享实例时从容器获取,需要独立实例时直接实例化即可。

以Java Spring为例:

// 普通类,无任何单例限制
public class MyService {
    private String state;

    public String getState() { return state; }
    public void setState(String state) { this.state = state; }
}

// 配置类注册共享实例
@Configuration
public class AppConfig {
    @Bean
    @Singleton // 仅容器层面保证单例,类本身仍可new
    public MyService sharedMyService() {
        return new MyService();
    }
}

// 业务类注入共享实例使用
@Component
public class UserService {
    private final MyService sharedService;

    public UserService(MyService sharedService) {
        this.sharedService = sharedService;
    }

    public void updateSharedState() {
        sharedService.setState("updated by UserService");
    }
}

// 任意地方创建独立新实例
public class SomeOtherClass {
    public void createNewInstance() {
        MyService newInstance = new MyService(); // 和共享实例完全独立
        newInstance.setState("state of new instance");
    }
}

方法二:静态字段持有共享实例,保留类的实例化能力

在目标类里加一个静态字段存储共享实例,提供静态方法获取它,同时允许直接通过构造函数创建新实例。这种方式简单直接,适合小型项目。

以Python为例:

class MyClass:
    # 静态字段存储全局共享实例
    _shared_instance = None

    def __init__(self, initial_state=""):
        self.state = initial_state

    @classmethod
    def get_shared_instance(cls):
        # 懒加载初始化共享实例
        if cls._shared_instance is None:
            cls._shared_instance = MyClass("initial shared state")
        return cls._shared_instance

# 使用共享实例
shared = MyClass.get_shared_instance()
shared.state = "modified shared state"

# 创建独立新实例
instance1 = MyClass("instance 1 state")
instance2 = MyClass("instance 2 state")

# 验证:共享实例状态全局统一,新实例各自独立
print(shared.state)       # 输出 modified shared state
print(instance1.state)    # 输出 instance 1 state
print(instance2.state)    # 输出 instance 2 state

方法三:工厂模式封装实例创建逻辑

写一个工厂类,专门区分返回共享实例还是新实例,把实例创建的逻辑集中管理,业务代码只需要调用对应的工厂方法即可,不用关心底层实现。

以C#为例:

public class MyClass {
    public string State { get; set; }
}

public static class MyClassFactory {
    private static MyClass _sharedInstance;

    // 获取全局共享实例
    public static MyClass GetSharedInstance() {
        if (_sharedInstance == null) {
            _sharedInstance = new MyClass { State = "initial shared state" };
        }
        return _sharedInstance;
    }

    // 创建全新的独立实例
    public static MyClass CreateNewInstance(string initialState = "") {
        return new MyClass { State = initialState };
    }
}

// 使用方式
var shared = MyClassFactory.GetSharedInstance();
shared.State = "updated shared state";

var newInstance1 = MyClassFactory.CreateNewInstance("new instance 1");
var newInstance2 = MyClassFactory.CreateNewInstance("new instance 2");

选型建议

  • 大型项目或已有DI框架的,优先用DI容器托管,符合架构规范;
  • 小型简单场景,用静态字段持有最省事;
  • 需要统一管理实例创建规则的,选工厂模式更灵活。

内容的提问来源于stack exchange,提问作者v.jha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 08:45:40