Am Montag, den 11.12.2006, 09:38 +0200 schrieb Graeme Geldenhuys:
> On 12/8/06, Marc Santhoff <[EMAIL PROTECTED]> wrote:
> > One working solution is to use a global var. This is bad but acceptable
> > for a singleton imo. If would be nice if the variable could be hidden.
> 
> 
> This is kinda what I have been using all along, except, I have a
> function, that creates the instance when used for the first time.  I
> call it the Lazy mans Singleton.  It works perfectly, if the developer
> knows about the global function!  Otherwise, they might still try and
> create a instance of the class, which is what I am trying to prevent.
> 

(Coming back on this topic late, sorry)

I've tried preventing a second instance like in the sources below, and
it does work.

Besides that I'd like to know if it has some effect on allocated
ressources behind the scenes in the constructor, will it allocate
ressources never freed?

<snip>
unit singleton;
interface
{$mode objfpc}
type
  tsingleton = class
        name: String;
        constructor create;
  end;
implementation

var
  s: TSingleton;


constructor TSingleton.create;
begin
        if not(assigned(s)) then
        begin
                inherited;
                (*... do initializations ...*)
                s := self;
                writeln('creating new singleton');
        end else begin
                self := s; // <-- Danger, Will Robinson!
        end;
end;

initialization
        s := NIL;
end.

end.
</snip>

<snap>
program singleton_test;
{$mode objfpc}
uses singleton;
var
        s, s2: TSingleton;
BEGIN
        s := TSingleton.create;
        s.name := 'one';
        writeln('name of s: '+s.name);
        
        s2 := TSingleton.create;
        s2.name := 'two';
        
        writeln('name of s: '+s.name);
        writeln('name of s2: '+s2.name);
END.
</snap>

Output:

$ ./singleton_test
creating new singleton
name of s: one
name of s: two
name of s2: two

If there are no drawbacks, this is a somewhat clean approach for single
threaded or low threadcount applications (which is what I use, each
application in question has it's own set of singletons)...

Marc


_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to