Abstrakter Singleton

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

  • Abstrakter Singleton

    Bisher habe ich das Singleton Entwurfsmuster wie folgt implementiert:
    PHP-Code:
    class Test
    {
        public static function 
    get_instance()
        {
            static 
    $instance null;

            if (!isset(
    $instance))
            {
                
    $instance = new self;
            }

            return 
    $instance;
        }

        protected function 
    __construct();

        final private function 
    __clone();
    }

    $test Test::get_instance(); 
    Jetzt denke ich über eine abstrakte Implementierung nach, damit nicht in jede Klasse mit Singleton-Funktionalität die als protected bzw. final private deklarierten __construct und __clone Methoden gestopft werden müssen.
    PHP-Code:
    abstract class Singleton
    {
        private static 
    $_instances = array();

        final public static function 
    get_instance($class)
        {
            if (!isset(
    self::$_instances[$class]))
            {
                
    $object = new $class();

                if (!(
    $object instanceof Singleton))
                {
                    throw new 
    SingletonException(
                        
    sprintf(
                            
    'The class %s does not inherit from Singleton',
                            
    $class
                        
    )
                    );
                }

                
    self::$_instances[$class] = $object;
            }

            return 
    self::$_instances[$class];
        }

        protected function 
    __construct();

        final private function 
    __clone();
    }

    class 
    Test extends Singleton
    {
    }

    $test Singleton::get_instance('Test'); 
    Die Nachteile sind allerdings unschön:
    Falls die von Singleton abgeleitete Klasse eine Kindklasse hat, die ebenfalls von Sinelton erben soll, wirds problematisch. Unter Umständen müsste wieder eine get_instance()-Methode implementiert werden, womit der abstrakte Ansatz an Zweckmäßigkeit verliert. Darüber hinaus sehe ich keine Möglichkeit, einer Klasse nicht nur eine Instanz, sondern eine begrenze Anzahl von Instanzen zu erlauben.

    Habt ihr da Ideen oder Erfahrungen, das praktischer umzusetzen?
    Zuletzt geändert von Griecherus; 18.01.2008, 01:59.
    Nieder mit der Camel Case-Konvention

  • #2
    Darüber hinaus sehe ich keine Möglichkeit, einer Klasse nicht nur eine Instanz, sondern eine begrenze Anzahl von Instanzen zu erlauben.
    Inwiefern begrenzt?
    Habt ihr da Ideen oder Erfahrungen, das praktischer umzusetzen?
    Nun, du musst den Singelton ja nicht in jeder Klasse implementieren sondern kannst eine Klasse erstellen die dafür zuständig ist die Singeltons zu verwalten und zu erstellen.
    Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

    Kommentar


    • #3
      Original geschrieben von tontechniker
      Inwiefern begrenzt?
      Nehmen wir als Beispiel mal eine User Klasse:
      PHP-Code:

      class User
      {
          private 
      $_user_id = -1;

          private function 
      __construct($user_id)
          {
              
      $this->_user_id = (int)$user_id;
          }

          public static function 
      get_instance($user_id)
          {
              static 
      $instances = array();

              if (!isset(
      $instances[$user_id]))
              {
                 
      $instances[$user_id] = new User($user_id);
              }

              return 
      $instances[$user_id];
          }
      }

      $user_1 User::get_instance(1);

      $user_2 User::get_instance(2); 
      Das würde genau eine Instanz für jeden Benutzer erlauben.


      Nun, du musst den Singelton ja nicht in jeder Klasse implementieren sondern kannst eine Klasse erstellen die dafür zuständig ist die Singeltons zu verwalten und zu erstellen.
      Richtig, der Singleton wird nicht in jede Klasse implementiert, und soll auch nicht als Klassen-Global-Verfügbar-Macher missbraucht werden, dafür ist das Registry-Pattern ja da.
      Könntest deinen Vorschlag konkretisieren? Ich denke ich kann dir noch nicht folgen.
      Nieder mit der Camel Case-Konvention

      Kommentar


      • #4
        Musst mal bissl suchen nach static:: oder get_called_class, da hatte - ich glaube combie wars - neulich mal was vorgeschlagen. Ist allerdings auf die neusten 5er, bzw. 6er Version begrenzt!

        Kommentar


        • #5
          Original geschrieben von PHP-Desaster
          Musst mal bissl suchen nach static:: oder get_called_class, da hatte - ich glaube combie wars - neulich mal was vorgeschlagen. Ist allerdings auf die neusten 5er, bzw. 6er Version begrenzt!
          Ja, das habe ich auch gefunden: get_called_class. Eine nette Funktion, um den Singleton tatsächlich abstrakt zu machen. Leider aber erst, wie du schon sagst, ab PHP 5.3 verfügbar. Danke totzdem!
          Nieder mit der Camel Case-Konvention

          Kommentar

          Lädt...
          X