在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1 unit Unit2; 2 3 interface 4 5 uses System.SysUtils; 6 7 type 8 { TSingle } 9 TSingle = class(TObject) 10 private 11 FStr: string; 12 protected 13 public 14 constructor Create; 15 class function GetInstance(): TSingle; 16 class function NewInstance: TObject; override; 17 procedure FreeInstance; override; 18 19 property Str: string read FStr write FStr; 20 published 21 22 end; 23 24 implementation 25 26 var 27 GlobalSingle: TSingle; 28 { TSingle } 29 constructor TSingle.Create; 30 begin 31 FStr := DateTimeToStr(Now); 32 end; 33 34 procedure TSingle.FreeInstance; 35 begin 36 inherited; 37 GlobalSingle := nil; 38 end; 39 40 class function TSingle.GetInstance: TSingle; 41 begin 42 if not Assigned(GlobalSingle) then 43 begin 44 GlobalSingle := TSingle.Create(); 45 end; 46 Result := GlobalSingle; 47 end; 48 49 class function TSingle.NewInstance: TObject; 50 begin 51 if not Assigned(GlobalSingle) then 52 GlobalSingle := TSingle(inherited NewInstance); 53 Result := GlobalSingle; 54 end; “在delphi中编译器对构造函数的保护级别进行了处理,即便设为private,编译器仍然会将其修正为public,所以覆盖基类中的NewInstance类方法,通过编译器魔法,系统在每次构造对象时都会调用这个类方法,通过重载它就可以实现对构造函数的控制。”[delphi深度探索] 要注意的是调用者要明确这是个单例方法,如果像上面依然声明了构造方法则再次创建时将重新执行构造方法。虽然TSingle这个类是唯一的但是那些初始化参数等已经改变。比如构造时候创建了TList,则再次初始化时原来的TList将被丢弃,造成内存泄露。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论