En diseño de software, el patrón de diseño Factory Method consiste en utilizar una clase constructora (al estilo del Abstract Factory) abstracta con unos cuantos métodos definidos y otro(s) abstracto(s): el dedicado a la construcción de objetos de un subtipo de un tipo determinado. Es una simplificación en la que la clase abstracta tiene métodos concretos que usan algunos de los abstractos; según usemos una u otra hija de esta clase abstracta, tendremos uno u otro comportamiento.
Script de ejemplo de Factory Method en PowerShell:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
<# # Clase abstracta: BoteColor # Crear una clase de BoteColor abstracta para que sirva de interfaz. # Constructor restringe la instanciación directa de esta clase. # Los métodos están definidos y obligan a sobrescribirse. #> class BoteColor { [String] $Nombre BoteColor ([String] $Nombre) { $type = $this.GetType() if ($type -eq [BoteColor]) { throw("Clase debe heredar") } $this.Nombre = $Nombre } [string] Abrir() { throw("Debe ser sobrescrito el método") } } <# # Azules: implementa BoteColor # Constructor usa el constructor base. # Se declaran métodos. #> class Azules : BoteColor { Azules ([String] $Nombre) : base ($Nombre) { } # @Override [string] Abrir() { return "Abierto el bote de pintura: {0}" -f $this.Nombre } } <# # Amarillos: implementa BoteColor # Constructor usa el constructor base. # Se declaran métodos. #> class Amarillos : BoteColor { Amarillos ([String] $Nombre) : base ($Nombre) { } # @Override [string] Abrir() { return "Abierto el bote de pintura: {0}" -f $this.Nombre } } <# # FabricaBotes # Clase que crea botes de colores # Los métodos/propiedades estáticos demuestran los conceptos de almacenamiento/ recuperación. #> class FabricaBotes { # Declarar y acceder a los colores nuevos static [BoteColor[]] $BoteColor static [Object] getByType([Object] $O) { return [FabricaBotes]::BoteColor.Where({$_ -is $O}) } static [Object] getByName([String] $Nombre) { return [FabricaBotes]::BoteColor.Where({$_.Nombre -eq $Nombre}) } # Crear un método para la mezcla de colores: Mezclar [BoteColor] CrearBote([String] $Nombre, [String] $Type) { return (New-Object -TypeName "$Type" -ArgumentList $Nombre) } } # Ejemplo de ejecución [FabricaBotes]$Fabrica = [FabricaBotes]::new() [BoteColor]$Bote1 = $Fabrica.CrearBote("Amarillo","Amarillos") [BoteColor]$Bote2 = $Fabrica.CrearBote("Azul","Azules") $Bote1.Abrir() $Bote2.Abrir() |
