php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 31.12.2011, 21:39  
archer42
Gast
 
Beiträge: n/a
Standard Flyweight Pattern

Hallo,
ich lese das Buch "PHP Design Patterns" von O'Reilly bzw, Stephan Schmidt.

In diesen bin ich nun bei den Strukturmustern angekommen.
Für das Strukturmuster Flyweight wird als Beispiel eine abstrakte Fabrik verwendet, welche eine Tabelle in verschiedenen Ausgaben darstellen soll (HTML, CGI,...).

Die ursprüngliche Abstrakte Fabrik war komplett Objektorientiert.
Die Zelle war ein eigenes Objekt, welches von der Zeile iteriert wurde, welches auch ein weiteres Objekt war usw.

Nun wird mit dem Flyweight Pattern die Inflation von Objekten entgegen gewirkt, allerdings bin ich hierbei nicht sicher, wie das funktionieren soll.
Ich glaube, dass die richtigen Zellen Infos nun nur in die Zeilen Klasse gespeichert wurden, um die Zellen Klasse zustandslos zu benutzen. Liege ich mit der Vermutung richtig?

Hier der Quellcode:
PHP-Code:
<?php namespace depatternsstructure;

interface 
TableFactory {
    public function 
createTable();
    public function 
createHeader();
    public function 
createRow();
    public function 
createCell();
}

abstract class 
Cell {
    abstract public function 
display($data);
}

class 
TextCell extends Cell {
    public function 
display($data) {
        print 
'|' str_pad($data20);
    }
}

abstract class 
Row {
    protected 
$cell;
    protected 
$cellData = array();

    public function 
__construct(Cell $cell) {
        
$this->cell $cell;
    }

    public function 
addCell($cell) {
        
$this->cellData[] = $cell;
    }

    abstract public function 
display();
}

class 
TextRow extends Row {
    public function 
display() {
        foreach (
$this->cellData as $data) {
            
$this->cell->display($data);
        }
        print 
"|\n";
        print 
"+" str_repeat("-", (count($this->cellData) * 21) - 1) . "+\n";
    }
}

abstract class 
Header extends Row {}

class 
TextHeader extends Header{
    public function 
display() {
        print 
"+" str_repeat("-", (count($this->cells) * 21) - 1) . "+\n";
        foreach (
$this->cells as $cell) {
            
$cell->display();
        }
        print 
"|\n";
        print 
"+" str_repeat("-", (count($this->cells) * 21) - 1) . "+\n";
    }
}

class 
TextTableFactory implements TableFactory {
    private 
$cell null;

    public function 
createTable() {
        
$table = new TextTable();
        return 
$table;
    }

    public function 
createRow() {
        
$row = new TextRow($this->createCell());
        return 
$row;
    }

    public function 
createHeader() {
        
$header = new TextHeader($this->createCell());
        return 
$header;
    }

    public function 
createCell() {
        if (
$this->cell === null) {
            
$this->cell = new TextCell();
        }
        return 
$this->cell;
    }

}


?>
Gruß,
archer42
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 02.01.2012, 10:20  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.654
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
[..] um die Zellen Klasse zustandslos zu benutzen. Liege ich mit der Vermutung richtig?
Das denke ich nicht, denn das wäre schon ein allzumerkwürdiges Konstrukt. Eine konkrete Zelle muss IMHO immer eine konkrete Instanz einer solchen Klasse sein.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist gerade online   Mit Zitat antworten
Alt 02.01.2012, 11:39  
archer42
Gast
 
Beiträge: n/a
Standard

Zitat:
Das denke ich nicht, denn das wäre schon ein allzumerkwürdiges Konstrukt. Eine konkrete Zelle muss IMHO immer eine konkrete Instanz einer solchen Klasse sein.
Hallo,
das verstehe ich nicht so ganz.

Also in dem Code sieht man, dass die einzelnen Zellen im Row Objekt durch ein Array gespeichert werden, so brauch man nicht mehr 4 Zellen-Objekte, sondern nur noch 1.
Dadurch das man die Kleinste Einheit in die darüberliegende Klasse Packt spart man eine Menge Instanzierungen von Objekten => Flyweight Pattern
  Mit Zitat antworten
Alt 02.01.2012, 12:35  
Benutzer
 
Registriert seit: 25.01.2011
Beiträge: 59
PHP-Kenntnisse:
Fortgeschritten
Renner befindet sich auf einem aufstrebenden Ast
Standard

Wenn ich das Pattern richtig verstanden habe, geht es darum, dass man keine zwei Zellen hat, die die selben Zustände haben. Wenn also zwei (Text-)Zellen den selben Wert haben, werden diese "wiederverwendet".

Stichwort: Immutable Object

Beispiel:

Ein Bild wird als ein zweidimensionales Array repräsentiert und hat 1000*1000 Pixel. Jeder Pixel wird durch ein Objekt repräsentiert. Die eine Hälfte der Pixel ist schwarz, die andere rot.

Ohne Flyweight: 1 Mio. Pixel-Objekte
Mit Flyweight: 2 Pixel-Objekte.
Renner ist offline   Mit Zitat antworten
Alt 02.01.2012, 15:00  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.267
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Gleich wohl eher im Sinne von ähnlich (Nutzung der gleichen Basisklasse) - zumindest nach meinem Verständnis des Pattern (interpretiert wohl jeder anders). Aber nur weil die Pixeleigenschaft $color rot bzw. schwarz ist, muss doch kein neues Objekt instanziert werden. Bei Bitmap + Flyweight-Pattern wären das dann ja im schlimmsten Fall doch wieder 2^32 (bzw. in diesem Beispiel 1 Mio.) Objekte.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 02.01.2012, 15:01  
archer42
Gast
 
Beiträge: n/a
Standard

Zitat:
Wenn ich das Pattern richtig verstanden habe, geht es darum, dass man keine zwei Zellen hat, die die selben Zustände haben. Wenn also zwei (Text-)Zellen den selben Wert haben, werden diese "wiederverwendet".
Interessante Idee, aber die Daten, welche in die Tabelle injiziert werden, also in dem Beispiel, sind unterschiedlich, also jede Zelle beinhaltet einen anderen String
  Mit Zitat antworten
Alt 02.01.2012, 16:13  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Ich sehe nicht, wie der Beispielcode funktionieren soll. Da fehlt zum Beispiel eine Klasse TextTable.

Die Cell-Klassen sind auch eigenartig. Die haben gar keinen Zustand und sind nur Funktionssammlungen. Zellen können die überhaupt nicht verkörpern. Die sind eher „Renderer“.
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 02.01.2012, 16:17  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Ist ein Flyweight-Pattern für PHP überhaupt relevant? Soweit ich das verstanden habe, soll damit dem verbrauchten Speicher entgegengewirkt werden. Speicherplatz (In dem Fall der Arbeitsspeicher) ist doch kein Thema für Webserver. Interessanter wird es bei der Performance, was aber wiederum mit dem Flyweight-Pattern nicht in Verbindung steht.
__________________
dsentker ist offline   Mit Zitat antworten
Alt 02.01.2012, 16:36  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.630
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Zitat:
Zitat von dsentker Beitrag anzeigen
Ist ein Flyweight-Pattern für PHP überhaupt relevant? Soweit ich das verstanden habe, soll damit dem verbrauchten Speicher entgegengewirkt werden. Speicherplatz (In dem Fall der Arbeitsspeicher) ist doch kein Thema für Webserver. Interessanter wird es bei der Performance, was aber wiederum mit dem Flyweight-Pattern nicht in Verbindung steht.
Gerade im Hinblick aufs memory_limit von PHP ist das ggf. sinnvoll. Und auch ein Webserver hat nicht unendlich RAM. Dazu kommt das PHP auch für Konsolenanwendungen genutzt werden kann. Dann sieht das ganze gleich völlig anders aus.
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".
Dark Guardian ist offline   Mit Zitat antworten
Alt 02.01.2012, 17:42  
archer42
Gast
 
Beiträge: n/a
Standard

Den Code habe ich wirklich etwas schlecht abgeschrieben...

Zitat:
Die Cell-Klassen sind auch eigenartig. Die haben gar keinen Zustand und sind nur Funktionssammlungen. Zellen können die überhaupt nicht verkörpern. Die sind eher „Renderer“.
Ja, die ursprüngliche Version hat die Zellen Daten in einer Zellen instanz gespeichert.
Mit dem Flyweight Pattern übernimmt das nun die Row-Klasse.
So ist zumindest das Beispiel.

Wie genau kann ich mir das Flyweight-Pattern vorstellen?
  Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Debugger mit Hilfe des Singleton Pattern sebastian3984 PHP Einsteiger 15 06.12.2011 15:47
[Erledigt] jQuery core pattern prototype recursion rudygotya JavaScript, Ajax und mehr 1 30.06.2011 10:28
TableDataGateway / ActiveRecord Pattern stayInside Software-Design 5 19.02.2011 03:00
Pattern Prototype __clone() coola PHP Einsteiger 5 08.02.2011 13:17
MVC - Pattern & Smarty ToxicToast PHP Tipps 2010 10 29.09.2010 15:35
Multidimensionales Array &amp;amp;amp;amp; Registry Pattern Knechtle PHP Tipps 2010 9 21.05.2010 10:26
Design Pattern BlackScorp PHP Tipps 2009 7 06.01.2010 19:04
[Erledigt] Crockfords Functional Pattern #fail phpdummi JavaScript, Ajax und mehr 1 20.06.2009 21:38
[Erledigt] preg_match und die Pattern Spoiler PHP Tipps 2009 9 13.02.2009 08:29
Formulargenerierung | Composite Pattern moveax1 PHP-Fortgeschrittene 13 27.01.2009 09:44
preg_replace: Gleiche Platzhalter im Pattern Lavalampe PHP Tipps 2009 5 16.01.2009 21:42
Design Pattern Harry B. Software-Design 7 02.09.2008 20:49
Folgendes Pattern PHP Tipps 2005 5 01.03.2005 12:41
Probleme mit Pattern bei Templateersetzung RudiS PHP-Fortgeschrittene 2 19.02.2005 22:09
preg_match --> pattern PHP Tipps 2004 4 27.08.2004 18:12

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
flyweight php, php design on the fly, flyweight pattern funktion, factory pattern mermshaus, flyweight pattern, php __clone flyweight, php fly weight, registry pattern multidimensionale arrays php

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:46 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum