No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Factory

17/26
Recursos

El patron Factory es creacional, se utiliza para ayudar a la creaci贸n de nuevas instancias de objetos.

Aportes 36

Preguntas 3

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Con este se evita cambiar cada a帽o el a帽o de los autos del a帽o actual:

<?php 

class Automobile {

    private $vehicleMake;
    private $vehicleModel;

    public function __construct($make, $model) {
        $this->vehicleMake = $make;
        $this->vehicleModel = $model;
    }

    public function getMakeAndModel() {
        return $this->vehicleMake.' - '.$this->vehicleModel;
    }
}


class AutomobileFactory {

    private static $model;

    public static function create($make) {
        self::$model = date('Y');
        return new Automobile($make, self::$model);
    }
}

$renault = new Automobile("Renault", 2019);
$toyota = AutomobileFactory::create("Toyota");


echo $renault->getMakeAndModel().PHP_EOL;
echo $toyota->getMakeAndModel().PHP_EOL;

Factory


Se trata de un patr贸n creacional, o sea, que nos ayuda a crear nuevas instancias de objetos.

El patr贸n factory consiste en utilizar una clase constructora abstracta con unos cuantos m茅todos definidos y otro(s) abstracto(s).

El patr贸n factory plantea simplificar una instancia, y eso lo podemos hacer por medio de otra clase que se encargue de obtener la instancia haciendo los procesos complejos requeridos, as铆 ante cualquier cambio solo modificamos esa clase factory y no nos preocupamos por modificar cada una de las instancias.

En este video hacen un ejemplo con una conexi贸n a distintas bases de datos usando el patr贸n Factory

Ac谩 un buen ejemplo de patr贸n de dise帽o Factory 馃槑:

https://www.youtube.com/watch?v=lLvYAzXO7Ek&ab_channel=BettaTech

Nota: es un patr贸n creacional es decir nos ayuda a la creaci贸n de nuevos objetos. El patr贸n se utiliza cuando la creaci贸n del objeto es un proceso muy completo, es decir recibe muchos par谩metros o realiza funciones complejas al realizaci贸n de la creaci贸n del objeto, con todo estamos logrando un c贸digo un poco m谩s abstracto, reutilizable y sobre todo que podemos cambiar las formas en que creamos los modelos y a trav茅s de factoty no nos afectan estos cambios estamos ganando mas logita y la otra cosa que podr铆a afectar es que si cambiamos una clase con el factory no nos afecta.

Este es el codigo de las laminas:

class Automobile
{
    private $vehicleMake;
    private $vehicleModel;

    public function __contruct($make, $model) {
        $this->vehicleMake = $make;
        $this->vehicleModel = $model;
    }

    public function getMakeAndModel() {
        return $this->vehivle.Make.' '.$this->vehicleModel;
    }
}

class AutomobileFactory
{
    private static $model = 2019;

    public static function create($make)
    {
        return new Automobile($make, self::$model);
    }
}

$a = new Automobile('Renault', 2019);
$b = AutomobileFactory::create('Toyota');

Acrode con lo que entend铆, implementas una clase que te ayuda a hacer mas facil la creacion de instancias de otras clases.

Pregunta 驴el colocar el a帽o ah铆 no ser铆a harcoding o en qu茅 casos algo se llama harcoding?

Factory

Tambien llamado: M茅todo fabrica o Constructor virtual

Qu茅 es?

Factory method es un patr贸n de dise帽o creacional que resuelve el problema de crear objetos de producto sin especificar sus clases concretas, define un m茅todo que debe utilizarse para crear objetos, en lugar de una llamada directa al constructor (operador new). Las subclases pueden sobrescribir este m茅todo para cambiar las clases de los objetos que se crear谩n.

Para que sirve?

Cuando la creaci贸n de un objeto es algo muy complejo.

El patr贸n Factory Method separa el c贸digo de construcci贸n de producto del c贸digo que hace uso del producto. Por ello, es m谩s f谩cil extender el c贸digo de construcci贸n de producto de forma independiente al resto del c贸digo.

Como se logra en c贸digo?

  1. Cree la interfaz del producto, esta declara las operaciones que todos los productos deben implementar, esta interfaz deber谩 declarar m茅todos que tengan sentido en todos los productos.
interface Product {
    operation(): string;
}
  1. El patr贸n factory consiste en utilizar una clase constructora abstracta con unos cuantos m茅todos definidos y otros abstractos.

La responsabilidad de esta clase no es crear productos, por lo general contiene alguna l贸gica de negocio, las subclases pueden cambiar indirectamente esa l贸gica.

A帽ada un patr贸n Factory Method vac铆o dentro de la clase creadora.

El tipo de retorno del m茅todo deber谩 coincidir con la interfaz com煤n de los productos.

abstract class Creator {
    
    public abstract factoryMethod(): Product;

    public someOperation(): string {
        // Llame al m茅todo de f谩brica para crear un objeto Producto.
        const product = this.factoryMethod();
        // Ahora, usa el producto.
        return `Creator: The same creator's code has just worked with ${product.operation()}`;
    }
}
  1. Haga que todos los productos sigan la misma interfaz esto proporciona varias implementaciones de la interfaz del producto
class ConcreteProduct1 implements Product {
    public operation(): string {
        return '{Result of the ConcreteProduct1}';
    }
}

class ConcreteProduct2 implements Product {
    public operation(): string {
        return '{Result of the ConcreteProduct2}';
    }
}
  1. Las subclases anulan el m茅todo de f谩brica para cambiar el tipo de producto resultante

El m茅todo usa el tipo de producto abstracto, aunque el tipo de producto en realidad se devuelve en este m茅todo. De esta manera, el Creador puede permanecer independiente de las clases de productos concretas.

class ConcreteCreator1 extends Creator {

    public factoryMethod(): Product {
        return new ConcreteProduct1();
    }
}

class ConcreteCreator2 extends Creator {
    public factoryMethod(): Product {
        return new ConcreteProduct2();
    }
}
  1. El c贸digo del cliente funciona con una instancia de un creador concreto, aunque a trav茅s de su interfaz base. Siempre que el cliente siga trabajando con el creador a trav茅s de la interfaz base, puede pasarla a la subclase de cualquier creador.
function clientCode(creator: Creator) {
    // ...
    console.log('Client: I\'m not aware of the creator\'s class, but it still works.');
    console.log(creator.someOperation());
    // ...
}

La aplicaci贸n elige el tipo de creador seg煤n la configuraci贸n o variables de entorno.

console.log('App: Launched with the ConcreteCreator1.');
clientCode(new ConcreteCreator1());
console.log('');

console.log('App: Launched with the ConcreteCreator2.');
clientCode(new ConcreteCreator2());
  1. La salida de este c贸digo seria:
[LOG]: "App: Launched with the ConcreteCreator1." 
[LOG]: "Client: I'm not aware of the creator's class, but it still works." 
[LOG]: "Creator: The same creator's code has just worked with {Result of the ConcreteProduct1}" 
[LOG]: "" 
[LOG]: "App: Launched with the ConcreteCreator2." 
[LOG]: "Client: I'm not aware of the creator's class, but it still works." 
[LOG]: "Creator: The same creator's code has just worked with {Result of the ConcreteProduct2}"

Pros

  • Evitar acoplamiento entre el creador y los productos concretos.
  • Principio de responsabilidad Unica: Se puede mover todo el c贸digo de creaci贸n de productos a un solo lugar, logrando que el c贸digo sea mas f谩cil de mantener.
  • Principio abierto cerrado: Se pueden agregar o quitar productos sin afectar el c贸digo cliente.

Contra

  • Puede hacer que el c贸digo se complique ya que se deben incorporar nuevas clases para implementar el patron. Lo ideal seria introducir el patr贸n en una jerarquia existente de clases creadoras.

En javascript ser铆a algo as铆鈥

class Automovil {
    constructor(make, year) {
        this.make = make
        this.year = year
    }
    getAutomovil() {
        return console.log(`This Automovil is make ${this.make} and year ${this.year}`);
    }
}

class AutomovilFactory {
    constructor(make) {
        this.make = make
    }
    create() {
        const year = 2019;
        return console.log(new Automovil(this.make, year));
    }
}

const automovil = new Automovil('Renault', 2018);
automovil.getAutomovil();
const autoRefactory = new AutomovilFactory('Toyota');
autoRefactory.create();

Se podr铆a usar este mismo patr贸n sin la necesidad de una nueva clase? Es decir agregar la funci贸n create dentro de la misma clase Automobile, O no ser铆a recomendable?

como asi que el patron factory no es una cancion de la factoria?

<?php

class Book {
private $info;
private $edition;

public function __construct($info, $edition) {
    $this->info = $info;
    $this->edition = $edition;
}

}

class BookFactory {
private static $edition = 鈥2022鈥;

public static function create($info) {
    return new Book($info, self::$edition);
}

}

$book2 = BookFactory::create(鈥榖ook info鈥);

un poco malo el ejemplo鈥i siquiera est谩 formateada ni resaltada la sintaxis y encima usa nombres poco semanticos en algunos casos de este y otros videos ($a, $vel, etc鈥)

Factory Method es un patr贸n de dise帽o creacional que proporciona una interfaz para crear objetos en una superclase, mientras permite a las subclases alterar el tipo de objetos que se crear谩n.

Muy buen capitulo鈥

Creo que se relaciona mucho con: Dependency Inversion Principle

Este patr贸n vendr铆a a ser cuando se hace build de DTOs por ejemplo?

Entonces se puede utilizar un Factory para que este se encargue de proveer las dependencias a la clase a instanciar?

Creo que el patron Factory podr铆a ser 煤til tambi茅n para los casos en donde se deban crear objetos utilizados dentro de los unit tests.

Factory, se utiliza para ayudar a creacion de nuevas instancias.
codigo mas abastracto mas utilizable.

Me gusto mucho ese ejemplo

  1. Patron Factory - Creacional
    Ayuda a crear objetos no sobrecargando informacion irrelevante u obvia

Factory = se utiliza para ayudar a la creaci贸n de nuevas instancias de objetos.(su objetivo es devolver instancias de una clase en particular por medio de un identificador)

El conocimiento para utilizar patrones de dise帽o, crea un codigo mas profesional, en esta enlace por si aun no te queda puedes encontrar mas ejemplos de varios patrones de dise帽o.
https://github.com/kamranahmedse/design-patterns-for-humans

La explicaci贸n est谩 bien, pero no taaaaaaaaaaaaan detallado. Les dejo un v铆deo donde lo explican con un ejemplo m谩s extendido.
https://www.youtube.com/watch?v=lLvYAzXO7Ek

En conclusi贸n este patr贸n sirve para crear objetos y sobre todo objetos que heredan de otros asi pudiendo modificarlos como queramos a帽adiendo diferentes implementaciones de lo mismo鈥
Un ejemplo
Este ser铆a la clase conocida como Product
interface Vehicule { public funcion SendToDealer() {} }
Este conjunto representa las clases conocida como Concrete Product
class Motorbike { public funcion SendToDealer() {} } class Plane { public funcion SendToDealer() {} } class Car { public funcion SendToDealer() {} }
Creadores de los Concrete Product Conocido como Concrete Creator que implementan una instancia Creator
`class MotorbikeFactory implements VehiculeFactory {
public function makeVehicule() {}
}

class PlaneFactory implements VehiculeFactory {
public function makeVehicule() {}
}

class CarFactory implements VehiculeFactory {
public function makeVehicule() {}
}`

Esta instancia es conocida como el Creator
interface VehiculeFactory { public function makeVehicule() {} }

Perfecta explicaci贸n. Gracias

Siento que al explicar los patrones de dise帽o siempre se busca un ejemplo simple para explicarlo pero se pierde scope de d贸nde se podr铆a utilizar. Yo al menos entiendo la idea, pero no logro ver un caso real de uso.

Esta seccion de patrones de dise帽o esta muy buena y he aprendido鈥 pero se me quedan muy cortos estos ejemplos!!! Demasiados b谩sicos

nota importante , para quienes quieran profundizar mas en este tema de patrones de dise帽o , existen dos tipos factory , el normal osea solo factory y el abstract factory que va mas enfocado en el uso de interfaces

Factory Method: Proporciona una interfaz para crear objetos en una superclase, pero permite que las subclases alteren el tipo de objetos que se crear谩n. Proporciona instanciaci贸n de objetos impl铆cita a trav茅s de interfaces comunes.

Ahora entiendo mucho mejor las Factories de Laravel xDDDD