Singleton oder nicht Singleton...

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Singleton oder nicht Singleton...

    Ich war mir nicht sicher ob's nicht vielleicht besser in der Brainstorming Sektion aufgehoben ist, hoffe es passt hier...

    Also zur Frage, warum eigentlich Singleton? Es heißt ja immer das man Singletons verwendet wenn z.B. nur ein einzige Instanz der Klasse erstellt werden soll, damit sich alle diese eine Instanz teilen. Ok, aber ist eine Klasse mit statischen Eigenschaften und Methoden nicht genau so gut?

    Ich meine, wo ist der Unterschied zwischen
    PHP-Code:
    class Foo
    {
        private static 
    $instance null;
        
        private function 
    __construct()
        {
        }
        
        public static function 
    instance()
        {
            if(
    self::$instance === null)
            {
                
    self::$instance = new Foo;
            }
            return 
    self::$instance;
        }
        
        public function 
    test()
        {
            return 
    "123";
        }
    }
    echo 
    Foo::instance()->test(); 
    und:
    PHP-Code:
    class Foo
    {
        private function 
    __construct()
        {
        }
        
        public static function 
    test()
        {
            return 
    "123";
        }
    }
    echo 
    Foo::test(); 
    Bitte korrigiert mich wenn ich mich irre, aber ist das nicht mehr oder weniger das selbe in grün? Es wird keine Instanz erstellt, ja, aber vorhanden sind die Eigenschaften und Methoden so auch nur einmal

    Gruß
    Olli

  • #2
    Dein Beispiel erfüllt auch nicht den eigentlichen Zweck von Singletons, nur ein einziges Objekt zu erzeugen. Das fällt dir nur nicht auf, weil du keine Membervariablen setzt und somit dein Objekt in immer dem selben Zustand bleibt.

    Bei dir erzeugt
    $a = new Foo();
    $b = new Foo();
    zwei Objekte - da die außer stur ausgeben nix können, sind sie gleich und damit gleichwertig einem einzigen Objekt. Überleg dir mal, was bei folgendem passieren sollte, wenn man nur eine Instanz hat (und was bei dir passiert):

    $a->setValue('bar');
    echo $b->getValue();

    Kommentar


    • #3
      Hi,

      der sinn des singletons ist es nur eine instanz zu erzeugen.
      Damit steht von vornherein fest dass man mindestens eine instanz
      braucht. Bei der static-lösung hat man keine instanz.
      Semantisch ist es so dass statische methoden und variablen den
      sogenannten classlevel-access darstellen. Hier geht es um
      eigenschaften und operationen die für die klasse , nicht das object,
      gelten oder von nutzen sind. Der interne status einer konkreten
      instanz einer klasse ist für statische methoden unwichtig um ihre
      aufgabe zu erfüllen.

      Stell dir z.B. mal vor du willst von einer klasse mit statischen
      methoden und eigenschaften erben , was
      erbst du dann eigentlich ?

      Singletons können während ihrer konstruktion einmalig
      mit parametern initialisiert werden. Bei statischen methoden
      musst du immer die parameter mitgeben.

      Man muss anmerken dass singletons häufig da verwendet werden
      wo sich nicht verwendet werden sollten. Nämlich da wo tatsächlich
      klassen mit statischen methoden und eigenschaften angebracht
      wären.
      Wann immer man ein singleton mit einem internen status braucht,
      also effektiv ein konstruiertes object dann ist das singletonpattern
      die richtige wahl. Andernfalls kann man das häufig mit der von
      dir genannten methode lösen.

      greets
      (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

      Kommentar


      • #4
        Ok, damit kann ich mich anfreunden...

        Meine leichte Verwirrung mag daher rühren das wie du schon sagtest Singletons oft da verwendet werden wo sie überhaupt nicht von Nöten sind. Ich habe in der letzten Zeit diverse Frameworks inspiziert, und da gab's halt Singletons wie Sand am Meer, und der Sinn und Zweck hat sich mir oft einfach nicht erschlossen weil sie meistens nichts konnten was eine statische Klasse an der Stelle nicht auch gekonnt hätte.

        Mir kam es so vor als hätten die Programmierer das nur immer gemacht weil man so schön Referenzen setzen kann, nur ob ich immer Foo:: benutze, oder $a, $b, $c, etc die ein und das selbe Objekt referenzieren, das ist irgendwie Jacke wie Hose wenn sich das ganze von der funktionalität her nicht wirklich unterscheidet...

        Gruß
        Olli

        Kommentar

        Lädt...
        X