如何处理全局共享数据与对象?TBuilding实例共享方案咨询
解决方案建议
一、避免全局变量:共享TBuilding/TCity实例的替代方案
1. 依赖注入(推荐)
给所有需要访问TBuilding的类(比如各类TCar子类、TGarage)添加构造参数或初始化方法,在创建实例时主动传入对应的TBuilding引用。示例代码:
type TCar = class private FOwnerBuilding: TBuilding; public constructor Create(ABuilding: TBuilding); end; constructor TCar.Create(ABuilding: TBuilding); begin inherited Create; FOwnerBuilding := ABuilding; end;
这种方式能明确类之间的依赖关系,代码解耦性更强,后续做单元测试也更容易(可传入模拟的TBuilding实例),彻底规避全局状态带来的意外问题。
2. 轻量上下文容器(Service Locator)
如果项目规模较大,依赖注入的代码量偏高,可以创建一个单例的上下文类,比如TAppContext,用来存放需要全局共享的核心实例:
type TAppContext = class private FCurrentCity: TCity; FCurrentBuilding: TBuilding; class var FInstance: TAppContext; public class function GetInstance: TAppContext; property CurrentCity: TCity read FCurrentCity write FCurrentCity; property CurrentBuilding: TBuilding read FCurrentBuilding write FCurrentBuilding; end;
注意:这个容器仅用来存放初始化后基本不变的核心实例,不要让它变成随意修改全局状态的“垃圾桶”。使用时尽量只做读取操作,避免在业务逻辑里随意修改容器内的实例,防止出现难以追踪的状态问题。
二、共享resourcestring的处理方式
完全不需要额外容器,直接把所有共享的可翻译字符串放在一个独立单元中,比如SharedResStrings.pas:
unit SharedResStrings; interface resourcestring SCarLowFuel = '车辆燃油不足,请及时加油'; SBuildingMaintenanceAlert = '建筑即将到期维护'; implementation end.
所有需要使用这些字符串的类所在单元,只要引用SharedResStrings单元,就能直接访问这些resourcestring。这种方式符合Delphi的资源管理机制,天然支持多语言切换,且维护方便——所有共享字符串集中在一处,不用分散在各个类里。
额外提示
不用强行合并TCity、TBuilding、TGarage类,你的类层级划分符合职责单一原则:城市管理建筑、建筑管理车库、车库管理车辆,每个类职责清晰,合并反而会导致类臃肿,后续维护成本更高。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

