如何让正在构造的类引用并返回已存在的实例?
让类在构造时复用已有实例的实现方法
你想在构造类实例时直接复用已有同名称实例的思路是合理的,但原代码里的做法行不通——因为构造函数的本质是初始化新创建的实例,一旦进入构造函数,内存里已经分配了新的MyClass对象,没办法把this指向已有的实例,这样做只会生成一个未初始化的空实例,而非复用已有对象。
正确的做法是用静态工厂方法封装实例创建逻辑,替代直接调用构造函数:
class MyClass { string _name; static List<MyClass> _existing = new List<MyClass>(); // 将构造函数设为私有,强制外部通过工厂方法获取实例 private MyClass(string name) { _name = name; } // 静态工厂方法:处理实例查找与创建逻辑 public static MyClass GetInstance(string name) { // 先在已有列表中查找匹配的实例 var existingInstance = _existing.FirstOrDefault(mc => mc._name == name); if (existingInstance != null) { return existingInstance; } // 没有匹配实例时,创建新实例并加入列表 var newInstance = new MyClass(name); _existing.Add(newInstance); return newInstance; } }
方案说明
- 私有构造函数:确保外部代码不能直接用
new创建实例,必须通过工厂方法获取,完全控制实例的创建流程。 - 静态工厂方法:先检查已有实例列表,找到匹配项直接返回;无匹配时再创建新实例并加入列表,保证相同
name只会对应一个实例。 - 语义清晰:比起在构造函数里做“替换实例”这种违背常规逻辑的操作,工厂方法的意图更明确,其他开发者能快速理解这是在做实例复用。
如果你的场景需要线程安全的实例管理,可以给_existing列表加锁,或者改用ConcurrentDictionary<string, MyClass>提升查找效率和线程安全性。
内容的提问来源于stack exchange,提问作者Jonathan Plumb
相关产品推荐
相关产品推荐

