2011-01-18 3 views
14

Après ~ 10 mois de procédure PHP, j'essaie maintenant de comprendre les principes de base de la POO et les modèles de conception. C'est un passe-temps, et je n'ai pas autant de temps que je voudrais le poursuivre, alors s'il vous plaît pardonner le niveau plutôt bas de cette question.Usine/Abstrait Confusion d'usine

Mon site (actuellement 100% procédural) est au coeur d'une bibliothèque. Les visiteurs envoient les points de données du script de la bibliothèque 2 - un élément type et un élément code.

Library.php utilise le type d'élément pour sélectionner un include, et l'include saisit le code pour atteindre la base de données, puis créer la page.

Quelques exemples:

[type] [code] 
game RoTo 
map  32 
unit 216 

Un exemple de lien serait library.php?type=game&code=RoTo

Tout fonctionne bien comme il est, mais comme je commencer avec POO je vois des points d'entrée facile évidente et les chemins d'héritage pour « objectiver » ce système. Je suis également enthousiasmé par la flexibilité que certaines classes bien écrites me donneront.

L'idée du modèle de conception me fait trébucher, cependant. Cela ressemble à un modèle d'usine, mais je suis confus au sujet des différences entre F et AF. J'ai lu d'autres questions de SO spécifiquement poser cette question, et j'ai lu les exemples sur OODesign mais j'ai l'impression qu'ils sont écrits dans une langue différente et c'est plutôt frustrant. Peut-être que si quelqu'un pouvait l'expliquer en utilisant mes propres structures de données, cela aurait plus de sens pour moi?

Désolé pour le problème.

Répondre

32

La différence entre Usine et Résumé Usine est assez simple. Dans ce dernier cas, l'usine elle-même est abstraite (!) Et ne peut pas être instanciée directement, mais doit être sous-classée.

Par exemple, l'usine:

class Document { 
    public function createPage() { 
     return new Page; 
    } 
} 

class LandscapeDocument extends Document { 
    public function createPage() { 
     return new LandscapePage; 
    } 
} 

En résumé usine:

abstract class Document { 
    abstract public function createPage(); 
} 

class PortraitDocument extends Document { 
    public function createPage() { 
     return new PortraitPage; 
    } 
} 

class LandscapeDocument extends Document { 
    public function createPage() { 
     return new LandscapePage; 
    } 
} 

En bref, le modèle d'usine a une implémentation par défaut dans la classe de l'usine elle-même. L'usine abstraite nécessite toutes les sous-classes pour implémenter leur propre version des méthodes d'usine.

C'est tout ce qu'il y a à faire.

+0

Ai-je raison pour décrire mon système de bibliothèque comme approprié pour un résumé modèle de conception d'usine , compte tenu de la description que j'ai posté? – Drew

+2

@Andrew: Je crois que Abstract Factory serait plus adapté à votre cas d'utilisation, oui. – netcoder

1

Voici une autre façon, vous pouvez regarder:

Pour effacer les buissons:
Un modèle d'usine est un modèle créationnelle. C'est-à-dire qu'il est utilisé pour créer des instances à utiliser.

Motif usine

  • Un modèle créationnelle où la logique de création de l'instance se trouve entre les mains de la classe Factory.
  • Un motif d'usine crée un seul type d'instance d'objet. Dans votre cas, il crée des objets de type LibraryObject en supposant que LibraryObject est l'objet le plus haut dans l'arborescence de la hiérarchie.

Résumé Motif (Usine des usines)

  • Un modèle créationnelle où la logique de création de l'instance se trouve entre les mains des classes qui mettent en œuvre l'interface usine /classe abstraite . Un motif Usine abstraite peut créer des objets de différents types, de sorte que vous pouvez utiliser les implémentations concrètes de l'interface Usine/classe abstraite pour créer des objets du type que vous désirez. C'est pourquoi on l'appelle une usine d'usines.

Une bonne référence serait ce lien ci-dessous, je vous suggère de lire le motif Méthode usine ainsi:
http://www.oodesign.com/creational-patterns/