2011-01-18 10 views
14

Después de ~ 10 meses de PHP procedural, ahora estoy tratando de entender los principios básicos de OOP y los patrones de diseño. Este es un hobby, y no tengo tanto tiempo como me gustaría dedicarle, así que, por favor, perdona el nivel bastante bajo de esta pregunta.Factory/Abstract Factory confusion

Mi sitio (actualmente 100% de procedimiento) es en el fondo una biblioteca. Los visitantes envían los puntos de datos de la secuencia de comandos 2 de la Biblioteca: un elemento type y el elemento code.

Library.php usa el tipo de elemento para seleccionar una inclusión, y la inclusión toma el código para golpear la base de datos y luego crea la página.

Algunos ejemplos:

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

Un enlace de ejemplo sería library.php?type=game&code=RoTo

Todo funciona muy bien como está, pero como puedo empezar con programación orientada a objetos que ver obvia los puntos de entrada y las rutas de herencia fácil para "objetivar" este sistema.

class LibraryObject 
{ 
    protected $_name; 
    protected $_description; 
} 

class Game extends LibraryObject 
{ 
    protected $_releaseDate; 
    etc. 
} 

También estoy entusiasmado con la flexibilidad que me darán algunas clases bien redactadas.

La idea del patrón de diseño me está haciendo tropezar. Parece un patrón de fábrica, pero estoy confundido acerca de las diferencias entre F y AF. He leído otras preguntas de SO específicamente haciendo esa pregunta, y he leído los ejemplos en OODesign, pero siento que están escritos en un idioma diferente y es bastante frustrante.

Tal vez si alguien pudiera explicarlo usando mis propias estructuras de datos, ¿tendría más sentido para mí?

Disculpa las molestias.

Respuesta

32

La diferencia entre Fábrica y Abstract Factory es bastante simple. En este último caso, la fábrica en sí misma es abstracta (!) Y no puede ser instanciada directamente, sino que debe ser subclasificada.

Por ejemplo, la fábrica:

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

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

En Abstract Factory:

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 pocas palabras, la fábrica cuenta con una implementación por defecto en la propia clase de fábrica. The Abstract Factory requiere que todas las subclases implementen su propia versión de los métodos de fábrica.

Eso es todo.

+0

I estaría correcta en la descripción de mi sistema de bibliotecas como adecuados para un patrón Resumen de diseño de fábrica , dada la descripción que publiqué? – Drew

+2

@Andrew: creo que Abstract Factory sería más adecuado para su caso de uso, sí. – netcoder

1

Aquí es otra forma se puede ver en ella:

Para borrar los arbustos:
Un patrón de fábrica es un patrón creacional. Es decir, se usa para crear instancias de uso.

patrón de la fábrica

  • Un patrón creacional donde la lógica de la creación de la instancia está en manos de la clase de fábrica.
  • Un patrón de fábrica solo crea un tipo de instancia de objeto. En su caso, crearía objetos del tipo LibraryObject suponiendo que LibraryObject es el objeto más alto en el árbol de jerarquía.

modelo abstracto (Fábrica de Fábricas)

  • Un patrón creacional donde la lógica de la creación de la instancia está en manos de las clases que implementan la interfaz de la clase de fábrica/abstract .
  • Un patrón abstracto de fábrica puede crear objetos de diferentes tipos, por lo que puede utilizar las implementaciones concretas de la interfaz Factory/clase abstracta para crear objetos de los tipos que desee. Es por eso que se llama Fábrica de Fábricas.

Una buena referencia sería el enlace de abajo, sugeriría que lee el patrón Factory Method así:
http://www.oodesign.com/creational-patterns/