如何在应用中共享指定类实例?需创建多实例无法使用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
相关产品推荐
相关产品推荐

