2009-02-11 19 views
6

Tengo un ABC con varias clases derivadas. Para crear estas clases derivadas que utilizo el patrón de la fábrica: archivoObjeto de fábrica frente a la función de fábrica

.h:

class derivedFactory 
{ 
public: 
    base* createInstance(); 
}; 

archivo .cpp:

base* derivedFactory::createInstance() 
{ 
    return new derived(); 
} 

¿Hay alguna ventaja de este sobre sólo tener una función libre:

archivo .h:

base* derivedFactoryFunction(); 

archivo .cpp:

base* derivedFactoryFunction() 
{ 
    return new derived(); 
} 

también: Yo uso el patrón de fábrica abstracta para la inyección de dependencia. Puede ser que utilice una jerarquía de herencia basado en el ABC:

class objectCreator 
{ 
public: 
    base* create() = 0; 
}; 

¿Hay alguna ventaja de usar esta función durante un puntero:

boost::function<base*()> factory_ptr; 

Usando boost :: bind/lambda esto parece hacer mi código más composable, y si me gustaría puedo envolver un objeto de fábrica real en él. Puedo ver que puede haber una ligera disminución en el rendimiento, pero esto es mucho de qué preocuparse, ya que solo se llama durante el inicio.

Respuesta

2

Depende de qué tan flexible debe ser su fábrica. Si la fábrica necesita información externa (como desde un archivo de configuración, opciones de programa, etc.) para determinar cómo construir objetos, entonces un objeto tiene sentido. Si todo lo que necesitará en los argumentos a fábrica, entonces una función probablemente esté bien.

La única ventaja que puedo ver al tener un puntero es para probar, donde puede usar una función de fábrica diferente.

+0

El puntero permitiría implementar el patrón abstracto de fábrica. Lo he expandido arriba –

1

Tener una interfaz con un único método o un puntero al método es equivalente.

Pero en el segundo caso que obtendrá en problemas si quiere otro método para ir junto con Ther primera ...

y la interfaz es más legible que el puntero del método en mi opinión.

Luego elige.

1

Yo diría que la ventaja de tener la función de fábrica como un método estático dentro de la clase en sí es que está claro que es parte del ciclo de vida de esa clase. Haciéndolo separado significa que otros programadores que usan su clase tendrían que buscar otro método para encontrar el método de fábrica.

Lo siento, no estoy seguro exactamente de lo que quiere decir pasando el puntero de función al método de factor, pero generalmente no usaría un puntero de función si no es necesario. Los punteros de función no pueden incluirse porque no se pueden resolver en tiempo de compilación, lo que significa que posiblemente sean más lentos. Pero además de eso, parece un mal diseño utilizar un puntero de función si ya puede estar seguro de a qué función va a llamar en tiempo de compilación.

1

¿Alguna vez quiere más de una fábrica para un tipo? Si es así, necesitas objetos de fábrica.