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 29.12.2011, 13:58  
archer42
Gast
 
Beiträge: n/a
Standard Factory - Parametisiert oder Abstrakt?

Hallo,

ich beschäftige mich momentan mit Designpatterns.

Nun bei dem Erzeugungsmuster, Factory-Pattern, gibt es grob zwei Arten der Umsetzung:

1. Als abstrakte Klasse
PHP-Code:
abstract class AbstractCook {
protected 
$dish;

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

public function 
sellDish() {
$dish $this->cookDish();
return 
$dish;
}

abstract protected function 
cookDish() {}


PHP-Code:
class CakeCook extends AbstractCook {

protected function 
cookDish() {
$dish = new Cake('strawberrys''choclate');
return 
$dish;
}


2. Als parametisierte Factory
PHP-Code:
class Cook {
protected 
$dish;

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

$public function sellDish() {
$dish $this->cookDish();
return 
$dish;
}

protected function 
cookDish() {
switch (
$this->dish) {
case 
'cake':
$dish = new cake;
break;
case 
'noodles':
$dish = new noodles;
break;
default:
throw new 
UnknownDish();
}
return 
$dish
Mir persönlich gefällt die zweite Variante eher, da es bei der Abstrakten Methode doch sehr schnell zu sehr vielen kleinen, abgeleiteten Klassen kommen kann.

Doch welche Variante ist die "bessere" oder ist es Anwendungsspezifisch?

Welche Variante benutzt man für welchen Fall?

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

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

Alt 29.12.2011, 14:07  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.114
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

braucht man nicht eine statische methode in einem factory welche mir dann das objekt einer klasse zurück gibt?

PHP-Code:
class Cook{

public static function 
factory($class){
   return new 
$class();
}

}

class 
Cake{

public function 
getRecipe(){
echo 
"irgendwas";
}
}

$cake Cook::factory('Cake');
$cake->getRecipe(); 
dachte dass mit dem Factory pattern dieses konstrukt gemeint ist
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Alt 29.12.2011, 14:11  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Irgendwie gefällt mir keiner der genannten Beispiel. Abgesehen von der nicht vorhandenen Codeeinrückung ist das Beispiel vielleicht auch einfach nur verdammt schlecht gewählt. Das zweite Beispiel würde ich als letztes bevorzugen, da es nicht flexibel ist. Wenn es irgendwann mal ein neues Gericht gibt, dann müsste man in die Factory-Methode rein und den neuen Typ hinzufügen. Besser fände ich so etwas:

PHP-Code:
$cook = new Cook();
$cook->setSpecifialisation(new CakeSpecifialisation());
$cook->getMeal(); //new Cake()


$cook = new Cook();
$cook->setSpecifialisation(new NoodlesSpecifialisation());
$cook->getMeal(); //new Noodles() 
Wobei ich Köche allgemein für ein schwaches beispiel bei Factories halte
__________________
dsentker ist offline   Mit Zitat antworten
Alt 29.12.2011, 14:15  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.114
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

http://en.wikipedia.org/wiki/Factory_method_pattern#PHP

wenn du die Factory auf nur bestimmte Klassen einschränken willst, dann würde ich keine switch case konstrukte bauen

PHP-Code:
class Cook
{
    private static 
$can_make = array(
    
'cacke','pizza','sushi'
    
);
    public static function 
make($what)
    {
        
$class ucfirst($what);
        if (!
class_exists($class)) {
            throw new 
Exception('Missing format class.');
        }
        if(!
in_array($what,self::$can_make){
          throw new 
Exception('The Cook does not know how to make it');
        }
        return new 
$class;
    }
}
 
$food Cook::make('pizza');
$food->getRecipe(); //Salami,Käse usw..
$food Cook::make('ravioli');
$foot->getRecipe(); //Expection.. 
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen

Geändert von BlackScorp (29.12.2011 um 14:28 Uhr).
BlackScorp ist offline   Mit Zitat antworten
Alt 29.12.2011, 14:28  
archer42
Gast
 
Beiträge: n/a
Standard

Zitat:
braucht man nicht eine statische methode in einem factory welche mir dann das objekt einer klasse zurück gibt?
Nicht unbedingt, aber statisch wäre ansich sinnvoller, da man eigentlich keine tausende Instanzen der Factory brauch.
Habe es aber der Einfachheithalber weggelassen

Zum schlechten Beispiel: Da hast du natürlich schon recht.
Ich kann ja mal sagen woran ich konkret gedacht habe:

Eine Art datenbankbasiertes Kochbuch, welches Hierarchisch aufgebaut ist.

Um nun die Gerichte zu erstellen würde sich eine Factory anbieten.
Diese erstellen für mich ein Objekt, welches das Gericht repräsentiert und Zutaten, Preis, Dauer usw. enthalten.
Da sehr viele Gerichte anfallen und sehr viele verschiedene Gerichte vorhanden sind dachte ich eben an das Factory pattern

Dieses ganze System würde sich dann in der Logikschicht befinden und evtl. erweitern lassen (Gericht wird gekocht, Gericht muss abgeholt werden, Gericht wird dem Kunden zu gewiesen, Gericht ist bezahlt usw.)

Die Frage ist natürlich, wie man diese Factory Methode umsetzten würde.
Mir viele spontan eine Art generierung auf, die Factory ist also dynamisch und holt sich aus der Persistenzschicht die benötigten Daten.
  Mit Zitat antworten
Alt 29.12.2011, 14:34  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.114
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

Zitat:
Zitat von archer42 Beitrag anzeigen
Eine Art datenbankbasiertes Kochbuch, welches Hierarchisch aufgebaut ist.
Da ja deine Daten in einer Datenbank stehen, könntest du ja eine Model factory erstellen
http://kohanaframework.org/3.2/guide...xamples/simple

finde ich eigentlich ganz nett wie es umgesetzt wurde hier wird halt mit Members gearbeitet statt mit Rezepten
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   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
Array als Parameterliste in Factory nutzen litterauspirna PHP Einsteiger 19 08.12.2011 17:26
Frage zum Factory Design Pattern axelf Software-Design 20 11.06.2011 00:44
[Erledigt] Factory in Elternklasse bitsnack PHP Einsteiger 5 05.12.2010 21:42
[Erledigt] Problem mit switch (factory) Mr.Karl PHP Tipps 2009 4 01.06.2009 20:36
factory, singleton, protected __construct verständnisproblem nuna PHP Tipps 2009 18 13.03.2009 00:19
Factory Netform Captcha Skaos PHP Tipps 2008 3 27.06.2008 06:34
Gegenstück zu parent:: oder Singleton abstrakt implement. ?? Melchior PHP-Fortgeschrittene 13 26.07.2007 21:25
Design-Pattern: Factory, Adapter, Interfaces allgemein Zergling-new PHP-Fortgeschrittene 5 05.10.2006 20:25
[Erledigt] Design Pattern - MySQL Sitzung in allen Objekten nutzen PHP-Fortgeschrittene 21 28.04.2005 22:18


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:42 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