Por favor tengan paciencia conmigo aquí. Sé que hay otras respuestas como: AngularJS: Servicio vs proveedor vs fábrica
Sin embargo, todavía no puedo entender cuándo usarías el servicio en la fábrica.
Por lo que puedo decir, la fábrica se usa comúnmente para crear funciones "comunes" que pueden ser llamadas por múltiples Controladores: Crear funciones comunes de controlador
Los documentos angulares parecen preferir la fábrica al servicio. ¡Incluso se refieren al "servicio" cuando usan la fábrica, lo cual es aún más confuso! http://docs.angularjs.org/guide/dev_guide.services.creating_services
Entonces, ¿cuándo se usaría el servicio?
¿Hay algo que solo sea posible o mucho más fácil con el servicio?
¿Hay algo diferente que ocurra detrás de escena? Diferencias de rendimiento / memoria?
Aquí hay un ejemplo. Aparte del método de declaración, parecen idénticos y no puedo entender por qué haría uno frente al otro. http://jsfiddle.net/uEpkE/
Actualización: Según la respuesta de Thomas, parece implicar que el servicio es para una lógica más simple y de fábrica para una lógica más compleja con métodos privados, por lo que actualicé el código de violín a continuación y parece que ambos son capaces de admitir funciones privadas.
myApp.factory('fooFactory', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo; }
return {
setFoobar: function(foo){
addHi(foo);
},
getFoobar:function(){
return fooVar;
}
};
});
myApp.service('fooService', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo;}
this.setFoobar = function(foo){
addHi(foo);
}
this.getFoobar = function(){
return fooVar;
}
});
function MyCtrl($scope, fooService, fooFactory) {
fooFactory.setFoobar("fooFactory");
fooService.setFoobar("fooService");
//foobars = "Hi fooFactory, Hi fooService"
$scope.foobars = [
fooFactory.getFoobar(),
fooService.getFoobar()
];
}
fuente
Respuestas:
Explicación
Tienes cosas diferentes aquí:
Primero:
this
" palabra clave).ref: angular.service vs angular.factory
Segundo:
¡Tenga en cuenta que todos los proveedores en AngularJS (valor, constante, servicios, fábricas) son singletons!
Tercero:
Usar uno u otro (servicio o fábrica) tiene que ver con el estilo de código. Pero, la forma común en AngularJS es usar la fábrica .
Por qué ?
( ref : http://www.amazon.com/Mastering-Web-Application-Development-AngularJS/dp/1782161821 ).
Uso
Servicio: podría ser útil para compartir funciones de utilidad que son útiles para invocar simplemente agregando
()
a la referencia de función inyectada. También se puede ejecutar coninjectedArg.call(this)
o similar.Fábrica: podría ser útil para devolver una función 'clase' que luego se puede actualizar para crear instancias.
Por lo tanto, use una fábrica cuando tenga una lógica compleja en su servicio y no quiera exponer esta complejidad .
En otros casos, si desea devolver una instancia de un servicio, simplemente use el servicio .
Pero verás con el tiempo que usarás la fábrica en el 80% de los casos, creo.
Para más detalles: http://blog.manishchhabra.com/2013/09/angularjs-service-vs-factory-with-example/
ACTUALIZACIÓN
Excelente publicación aquí: http://iffycan.blogspot.com.ar/2013/05/angular-service-or-factory.html
ACTUALIZACIÓN
El equipo de AngularJS hace su trabajo y da una explicación: http://docs.angularjs.org/guide/providers
Y desde esta página:
fuente
Allernhwkim originalmente publicó una respuesta a esta pregunta enlazando a su blog , pero un moderador la eliminó. Es la única publicación que he encontrado que no solo te dice cómo hacer lo mismo con el servicio, el proveedor y la fábrica, sino que también te dice qué puedes hacer con un proveedor que no puedes con una fábrica, y con Una fábrica que no se puede con un servicio.
Directamente desde su blog:
Esto muestra cómo CarService siempre producirá un automóvil con 4 cilindros, no puede cambiarlo por automóviles individuales. Mientras que CarFactory devuelve una función para que pueda hacerlo
new CarFactory
en su controlador, pasando una serie de cilindros específicos para ese automóvil. No puede hacerlonew CarService
porque CarService es un objeto, no una función.La razón por la que las fábricas no funcionan así:
Y devolver automáticamente una función para que pueda crear una instancia, es porque entonces no puede hacer esto (agregue cosas al prototipo / etc.):
Vea cómo es, literalmente, una fábrica que produce un automóvil.
La conclusión de su blog es bastante buena:
Si descubres que solo estás devolviendo un objeto en fábrica, probablemente deberías usar el servicio.
No hagas esto:
Utilice el servicio en su lugar:
fuente
El concepto para todos estos proveedores es mucho más simple de lo que parece inicialmente. Si disecciona a un proveedor y extrae las diferentes partes, queda muy claro.
En pocas palabras cada uno de estos proveedores es una versión especializada de la otra, en este orden:
provider
>factory
>value
/constant
/service
.Mientras el proveedor haga lo que pueda, puede usar el proveedor más adelante en la cadena, lo que daría como resultado escribir menos código. Si no logra lo que desea, puede subir la cadena y solo tendrá que escribir más código.
Esta imagen ilustra lo que quiero decir, en esta imagen verá el código de un proveedor, con las partes resaltadas que le muestran qué partes del proveedor podrían usarse para crear una fábrica, valor, etc.
(fuente: simplygoodcode.com )
Para obtener más detalles y ejemplos de la publicación del blog de donde obtuve la imagen, vaya a: http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/
fuente
Tanto la fábrica como el servicio dan como resultado objetos únicos que los proveedores pueden configurar e inyectar en controladores y ejecutar bloques. Desde el punto de vista del inyectado, no hay absolutamente ninguna diferencia si el objeto proviene de una fábrica o de un servicio.
Entonces, ¿cuándo usar una fábrica y cuándo usar un servicio? Se reduce a su preferencia de codificación, y nada más. Si te gusta el patrón JS modular, entonces ve a la fábrica. Si le gusta el estilo de la función de constructor ("clase"), vaya al servicio. Tenga en cuenta que ambos estilos admiten miembros privados.
La ventaja del servicio podría ser que es más intuitivo desde el punto de vista de OOP: cree una "clase" y, junto con un proveedor, reutilice el mismo código en todos los módulos y varíe el comportamiento de los objetos instanciados simplemente suministrando diferentes parámetros para el constructor en un bloque de configuración.
fuente
No hay nada que una Fábrica no pueda hacer o haga mejor en comparación con un Servicio. Y viceversa. La fábrica parece ser más popular. La razón de esto es su conveniencia en el manejo de miembros privados / públicos. El servicio sería más torpe en este sentido. Al codificar un Servicio, tiende a hacer públicos los miembros de su objeto a través de "esta" palabra clave y de repente puede descubrir que esos miembros públicos no son visibles para los métodos privados (es decir, funciones internas).
Angular utiliza la palabra clave "nueva" para crear un servicio para usted, por lo que la instancia que Angular pasa al controlador tendrá el mismo inconveniente. Por supuesto, puede superar el problema utilizando esto / aquello:
Pero con una gran constante de servicio, esto haría que el código fuera poco legible. Además, los prototipos del Servicio no verán miembros privados, solo públicos estarán disponibles para ellos:
En resumen, usar Factory es más conveniente. Como Factory no tiene estos inconvenientes. Recomendaría usarlo por defecto.
fuente
myapp.service(...)
falta por completo. Dónde senew Service()
supone que debe llamarse, en la función de servicio o en el lugar donde se inyecta el Servicio. El tercer listado simplemente no es posible en el contexto demyapp.service ('Service', function() {...})
.Incluso cuando dicen que todos los servicios y fábricas son únicos, no estoy 100% de acuerdo con eso. Yo diría que las fábricas no son singletons y este es el punto de mi respuesta. Realmente pensaría en el nombre que define cada componente (Servicio / Fábrica), quiero decir:
Una fábrica porque no es un singleton, puede crear tantos como desee cuando se inyecta, por lo que funciona como una fábrica de objetos. Puede crear una fábrica de una entidad de su dominio y trabajar más cómodamente con estos objetos que podrían ser como un objeto de su modelo. Cuando recupera varios objetos, puede asignarlos en estos objetos y puede actuar como otra capa entre el DDBB y el modelo AngularJs. Puede agregar métodos a los objetos para que se oriente un poco más a su aplicación AngularJs.
Mientras tanto un servicio es un singleton, por lo que solo podemos crear 1 de un tipo, tal vez no crear, pero solo tenemos 1 instancia cuando inyectamos en un controlador, por lo que un servicio proporciona más como un servicio común (llamadas de descanso, funcionalidad ...) a los controladores.
Conceptualmente, puede pensar que los servicios brindan un servicio, las fábricas pueden crear múltiples instancias (objetos) de una clase
fuente
Servicios
Sintaxis : module.service ('serviceName', function); Resultado : al declarar serviceName como argumento inyectable, se le proporcionará la referencia de función real que se pasó a module.service.
Uso : podría ser útil para compartir funciones de utilidad que son útiles para invocar simplemente agregando () a la referencia de función inyectada. También se puede ejecutar con injectedArg.call (this) o similar.
Suerte
Sintaxis : module.factory ('factoryName', función);
Resultado : al declarar factoryName como argumento inyectable, se le proporcionará el valor que se devuelve invocando la referencia de función pasada a module.factory.
Uso : podría ser útil para devolver una función de 'clase' que luego se puede actualizar para crear instancias.
Proveedores
Sintaxis : module.provider ('providerName', function);
Resultado : al declarar providerName como argumento inyectable, se le proporcionará el valor que se devuelve invocando el método $ get de la referencia de función pasada a module.provider.
Uso : podría ser útil para devolver una función de 'clase' que luego se puede actualizar para crear instancias pero que requiere algún tipo de configuración antes de ser inyectada. ¿Quizás útil para clases que son reutilizables en proyectos? Todavía es un poco confuso en este caso.
fuente
Puede usar ambos de la forma que desee : ya sea crear un objeto o simplemente acceder a las funciones de ambos
Nota :
Nota :
Conclusión
fuente
La fábrica y el servicio son el método más utilizado. La única diferencia entre ellos es que el método de servicio funciona mejor para los objetos que necesitan jerarquía de herencia, mientras que Factory puede producir funciones y primitivas de JavaScript.
La función de proveedor es el método principal y todos los demás son simplemente azúcar sintáctica. Solo lo necesita si está creando un código reutilizable que necesita una configuración global.
Existen cinco métodos para crear servicios: Valor, Fábrica, Servicio, Proveedor y Constante. Puede obtener más información sobre esto aquí servicio angular , este artículo explica todos estos métodos con ejemplos prácticos de demostración.
.
fuente