2010-03-05 14 views
18

Acabo de leer el Método de fábrica. Entiendo que proporciona una forma de delegar la creación de instancias en subclases. Pero no pude entender los posibles usos en un escenario del mundo real.Ejemplos del mundo real del patrón Método de fábrica

¿Alguien puede dar un ejemplo típico que muestra cómo el patrón de método de fábrica se puede utilizar para que pueda relacionarse con lo que he leído.

Un enunciado del problema para el que el patrón de método de fábrica es la mejor solución sería suficiente para dejarlo en claro.

Respuesta

41

Un patrón de diseño de fábrica que funciona como puente entre varias clases. Considere un ejemplo de uso de múltiples servidores de bases de datos como SQL Server y Oracle. Si está desarrollando una aplicación utilizando la base de datos SQL Server como back-end, pero en el futuro necesitará cambiar la base de datos back-end a Oracle, tendrá que modificar todo su código, si no ha escrito su código siguiendo el patrón de diseño de fábrica.

En el patrón de diseño de fábrica necesita hacer muy poco trabajo para lograr esto. Un patrón de diseño de fábrica que implementa la clase lo cuida y disminuye su carga. Cambiar de servidor de base de datos no te molestará en absoluto. Solo necesita hacer algunos pequeños cambios en su archivo de configuración.

+1

+1 para obtener un ejemplo adecuado. El código de muestra para esto se puede encontrar en http://davidhayden.com/blog/dave/archive/2005/04/02/923.aspx – blitzkriegz

+1

@Mahatma: gracias por ese enlace :) – Sarfraz

+0

@Sarfraz ejemplo perfecto, me ayudó a visualizar el ejemplo del mundo real. +1 por eso. – tugberk

2

De API que estoy desarrollando en este momento:

WebGalleryFactory factory = WebGalleryFactory.newInstance (WebGalleryType.PICASA); 
WebAlbum album = factory.createAlbum (title, description); 

En este ejemplo utilizo el método de fábrica para crear abstracta de fábrica de un tipo determinado (PICASA en el ejemplo).

Estos dos patrones se utilizan a menudo juntos.

+3

¿Por qué no crear instancias de PicasaWebGalleryFactory explícitamente? – Rekin

+1

¿Por qué es una fábrica? ¿No podrías tener una clase de WebGallery y una subclase de PicasaWebGallery? – paul

3

Zend_Db lo usa en su clase Zend_Db_Adapter para permitir la creación de diferentes tipos de objetos de base de datos en función de la configuración de la base de datos pasada desde un objeto de configuración.

+0

Otros ejemplos de métodos de fábrica: Zend_Cache :: factory(), Zend_Memory :: factory().Zend_Log_Writer también tiene métodos de fábrica para inicializar adaptadores concretos de Zend_Log_Writer_Abstract. Sin embargo, hay que tener en cuenta una cosa: esas implementaciones generalmente están en forma cuando el método de fábrica se inyecta directamente en el producto (no hay clases separadas de AbstractCreator/ConcreteCreator). –

+0

Acaba de volver a verificar el código: ZF realmente utiliza lo que se llama Simple Factory, que es idioma y no un patrón (descrito, por ejemplo, en HF Design Patterns). También vi muchos métodos de fábrica estáticos, al menos la implementación fue muy similar a lo que Bloch discutió en Java efectivo. Y no pude encontrar la implementación exacta de GoF del patrón de método de fábrica. –

2

Un ejemplo de la Base de biblioteca de clases de .NET (BCL) es Control.CreateControlsInstance, que se es usado por muchos otros miembros de la (Windows Forms) clase de control.

Puede anular este método protegido para proporcionar su propia colección de controles, p. cuando está implementando un control personalizado.

4

Un ejemplo de código PHP:

interface DbTable 
{ 
    public function create($array); 
} 

class MySqlTable implements DbTable 
{ 
    public function create($array) 
    { 
     // add a record to a table on mysql database 
    } 
} 

class OracleTable implements DbTable 
{ 
    public function create($array) 
    { 
     // add a record to a table on oracle database 
    } 
} 

class TableFactory 
{ 
    private $dbTypeConfig = 'mysql'; 

    public function createTable() 
    { 
     if ($this->dbTypeConfig == 'mysql') { 
      return new MySqlTable(); 
     } elseif ($this->dbTypeConfig == 'oracle') { 
      return new OracleTable(); 
     } 
     return null; 
    } 
} 
0

del diseño simple del patrón de fábrica no pertenece a las bandas de cuatro. Un patrón de fábrica simple es uno de los que devuelve una instancia de una de varias clases posibles, según los datos que se le proporcionen. Esto implica que las clases que devuelve tienen la misma clase primaria y métodos, pero cada uno de ellos realiza la tarea de manera diferente para diferentes tipos de datos. Here is the complete post with real world example

Cuestiones relacionadas