Creación de Fábricas de Objetos con Patron RORO en JavaScript
Clase 11 de 20 • Curso Intermedio de Programación Orientada a Objetos en JavaScript
Resumen
Factory pattern (o fábrica de objeto) y RORO (Recibir un Objeto, Retornar un Objeto) son dos patrones que nos ayudan a crear moldes de objetos a partir de funciones. Con ello ya no sería necesario utilizar objetos literales ni deep copy con recursividad.
Generando objetos a partir de funciones
Generaremos una función que nos permita generar nuevos estudiantes. Esta función va a recibir un objeto (con los datos del nuevo estudiante) como parámetro y devolverá el nuevo objeto generado.
function isObject(subject) {
return typeof subject == "object";
}
function isArray(subject) {
return Array.isArray(subject);
}
function createStudent({
name,
email,
age,
twitter,
instagram,
facebook,
approvedCourses,
learningPaths,
}) {
return {
name,
email,
age,
approvedCourses,
learningPaths,
socialMedia: {
twitter,
instagram,
facebook,
},
};
}
Antes de crear nuevos objetos, podríamos darles unas mejoras a nuestra función:
- Los atributos
approvedCoursesylearningPathsdeberían ser arreglos vacíos por defecto y así evitamos que seanundefineden caso de que no se envíen datos en el momento que se genere un nuevo estudiante:
function isObject(subject) {
return typeof subject == "object";
}
function isArray(subject) {
return Array.isArray(subject);
}
function createStudent({
name,
email,
age,
twitter,
instagram,
facebook,
approvedCourses = [], // 👈👈
learningPaths = [], // 👈👈
}) {
return {
name,
email,
age,
approvedCourses,
learningPaths,
socialMedia: {
twitter,
instagram,
facebook,
},
};
}
- Si en caso de invocar a la función
createStudentno mandamos siquiera un objeto vacío como argumento, nos dará un error. Evitemos esto declarando que el parámetro que recibe la función puede ser un objeto vacío por defecto:
function isObject(subject) {
return typeof subject == "object";
}
function isArray(subject) {
return Array.isArray(subject);
}
function createStudent({
name,
email,
age,
twitter,
instagram,
facebook,
approvedCourses = [],
learningPaths = [],
} = {}) { // 👈👈
return {
name,
email,
age,
approvedCourses,
learningPaths,
socialMedia: {
twitter,
instagram,
facebook,
},
};
}
- Deberíamos hacer que algunos campos como
emailsean obligatorios de enviar, pues, no todos los atributos se deberían quedar comoundefinedni tampoco deberíamos poner valores por defecto a ciertos datos personales de un estudiante. Por tanto, deberíamos avisar mediante un mensaje de error personalizado que ciertos campos son obligatorios:
function isObject(subject) {
return typeof subject == "object";
}
function isArray(subject) {
return Array.isArray(subject);
}
// Creamos una función con el objetivo de generar un Error el cual
// tendrá un mensaje customizado por nosotros.
// Como parámetro indicamos el nombre del atributo que no se está enviando (String)
function requiredParam(param) { // 👈👈
throw new Error(param + " es obligatorio"); // Este es el mensaje de error generado
}
function createStudent({
// Por defecto, invocamos a la nueva función requiredParam en aquellos
// atributos que deseamos que sean obligatorios. Indicamos como argumento el nombre
// de dicho atributo.
name = requiredParam("name"), // 👈👈
email = requiredParam("email"), // 👈👈
age,
twitter,
instagram,
facebook,
approvedCourses = [],
learningPaths = [],
} = {}) {
return {
name,
email,
age,
approvedCourses,
learningPaths,
socialMedia: {
twitter,
instagram,
facebook,
},
};
}
Ahora, si intentamos crear un objeto que no tenga, por ejemplo, asignado un valor en la propiedad `name`, la consola nos mostrará el mensaje de error que creamos:
const juan = createStudent({ email: "juanito@frijoles.co"});

Aprendamos ahora a cómo crear [propiedades privadas en JavaScript](https://platzi.com/clases/2419-javascript-poo-intermedio/39817-module-pattern-y-namespaces-propiedades-privadas-e/). 👨💻🚀
*Contribución creada por: Martín Álvarez (Platzi Contributor)*