20070624
En esta ocasión continúo con la serie de artículos acerca de patrones y antipatrones de arquitectura. Espero que les sea útil. Ejemplificaré utilizando VB.NET y C# en cada uno de los patrones.
Tipo de patrón
Creador de objetos
Objetivo
Separar la trucción de un objeto complejo de su representación, de modo que un solo constructor pueda crear diferentes representaciones.
Motivación
Es importante en muchos casos tener objetos que tienen diferentes características pero que comparten una estructura en común, el problema viene de que los diferentes objetos en común pueden ser ilimitados, por lo tanto es muy útil el poder modificar las diferentes opciones sin tener que modificar el objeto que lee las características. Cada uno de los sub objetos de la clase principal se especializan en diferentes características pero se construyen desde un solo lugar. El patrón constructor captura todas las relaciones entre la clase principal y sus subclases, cada subclase especializada es llamada constructor especializado y el lector de sub clases es llamado director.
Aplicación
Debe usarse el patrón Constructor cuando el algoritmo para la creación de un objeto complejo deba ser independiente de las partes que lo conforman y cómo son ensambladas y cuando el proceso de construcción deba permitir diferentes representaciones del objeto construído.
Estructura


Participantes
Constructor: ConstructorDeDodgeAvenger. Establece una interfase abstracta para crear las partes de un objeto producto.
Constructores concretos: Avenger20SEMTX, Avenger24SEATX, AvengerSXTATX y AvengerSXTATXSport. Construyen y ensamblan partes del producto implementando la interfase del constructor.
Director: Armadora. Construye un objeto utilizando la interfase del constructor.
Producto: DodgeAvenger. Representa el objeto concreto que se está construyendo, los constructores concretos construyen la represeon interna del producto y definen el proceso por el cuál es ensamblado. Incluye clases que definen las partes que lo constituyen, incluyendo las interfases para ensamblar las partes en el resultado final.
Colaboración
- El Cliente crea el objeto Director y lo configura utilizando el constructor deseado.
- El Director notifica al Constructor cuando una parte del producto debe ser construída.
- El Constructor maneja las peticiones del Director y añade las partes del Producto.
- El Cliente obtiene el producto del Constructor.
El siguiente diagrama de interacción ilustra la manera en que el objeto Constructor y el objeto Director interactúan con el Cliente.

Consecuencias
Los beneficios del uso del patrón Constructor son los siguientes:
- Permite variar la representación interna de un producto.
- Aisla el código de representación y el de construción.
- Da un mayor control en el proceso de construcción.
Implementación
Un ejemplo de implementación puede ser un configurador de automóviles, este genera las propiedades comunes del modelo de automóvil pero deja a los constructores concretos la tarea de asignar accesorios opcionales según el tipo de edición de atomóvil que se elija construír. Nuevas ediciones (representaciones) del mismo modelo de automóvil pueden construírse sobre la misma clase constructora sin necesidad de cambiar la lógica de construcción de las demás ediciones.
Código de ejemplo
VB.NET
Namespace Patrones
Public Enum TipoDeEstereo
AM_FM_CD_MP3
AM_FM_CD_MP3_ControlDeAudioEnElVolante
End Enum
Public Enum NumeroDeBocinas
Cuatro = 4
Seis = 6
End Enum
Public Enum TipoDeVolante
Plastico_AjusteInclinacion_AjusteTelescopico
Piel_AjusteInclinacion_AjusteTelescopico
End Enum
Public Enum TipoDeRines
Acero17
Aluminio17
End Enum
Public Enum TipoMotor
_1998_4cil_16valvulasDOHC
_2360_4cil_16valvulasDOHC
End Enum
Public Enum Potencia
_158HP_6400rpm
_172HP_6000rpm
End Enum
Public Enum Torque
_141Lb_Ft_5000rpm
_165Lb_Ft_4400rpm
End Enum
Public Enum Transmision
Manual5Velocidades
Automatica4Velocidades
End Enum
Public Class DodgeAvenger
Dim _Estereo As TipoDeEstereo
Dim _Bocinas As NumeroDeBocinas
Dim _ControlDeVelocidad As Boolean = True
Dim _Acabados As String = "Imitación aluminio en la palanca de cambios e imitación titanio en las puertas"
Dim _Seguros As String = "Eléctricos a control remoto"
Dim _Vestiduras As String = "Tela"
Dim _Volante As TipoDeVolante
Dim _Direccion As String = "Hidráulica"
Dim _AireAcondicionado As Boolean = True
Dim _Retrovisores As String = "Electricos"
Dim _Cristales As String = "Electricos"
Dim _Rines As TipoDeRines
Dim _Frenos As String = "2 De disco 2 ventilados delanteros"
Dim _InmovilizadorElectronicoMotor As Boolean = True
Dim _BolsasDeAire As String = "Conductor y pasajero"
Dim _Motor As TipoMotor
Dim _Potencia As Potencia
Dim _Torque As Torque
Dim _Transmision As Transmision
Dim _Spoiler As Boolean
Dim _UConnect As Boolean
Dim _Quemacocos As Boolean
Dim _FarosDeNiebla As Boolean
Public Sub New()
End Sub
Public Sub ConfiguraEstereo(ByVal estereo As TipoDeEstereo)
Me._Estereo = estereo
End Sub
Public Sub ConfiguraBocinas(ByVal bocinas As NumeroDeBocinas)
Me._Bocinas = bocinas
End Sub
Public Sub ConfiguraVolante(ByVal volante As TipoDeVolante)
Me._Volante = volante
End Sub
Public Sub ConfiguraRines(ByVal rines As TipoDeRines)
Me._Rines = rines
End Sub
Public Sub ConfiguraMotor(ByVal motor As TipoMotor)
Me._Motor = motor
End Sub
Public Sub ConfiguraPotencia(ByVal potencia As Potencia)
Me._Potencia = potencia
End Sub
Public Sub ConfiguraTorque(ByVal torque As Torque)
Me._Torque = torque
End Sub
Public Sub ConfiguraTransmision(ByVal transmision As Transmision)
Me._Transmision = transmision
End Sub
Public Sub ConfiguraSpoiler(ByVal spoiler As Boolean)
Me._Spoiler = spoiler
End Sub
Public Sub ConfiguraUConnect(ByVal uConnect As Boolean)
Me._UConnect = uConnect
End Sub
Public Sub ConfiguraQuemacocos(ByVal quemaCocos As Boolean)
Me._Quemacocos = quemaCocos
End Sub
Public Sub ConfiguraFarosDeNiebla(ByVal farosDeNiebla As Boolean)
Me._FarosDeNiebla = farosDeNiebla
End Sub
End Class
Friend MustInherit Class ConstructorDeDodgeAvenger
Protected Avenger As DodgeAvenger
Public Sub New()
End Sub
Public Function ObtenerAvenger() As DodgeAvenger
Return Me.Avenger
End Function
Public Sub CreaNuevoAvenger()
Me.Avenger = New DodgeAvenger()
End Sub
Public MustOverride Sub PreparaEstereo()
Public MustOverride Sub PreparaBocinas()
Public MustOverride Sub PreparaVolante()
Public MustOverride Sub PreparaRines()
Public MustOverride Sub PreparaMotor()
Public MustOverride Sub PreparaPotencia()
Public MustOverride Sub PreparaTorque()
Public MustOverride Sub PreparaTransmision()
Public MustOverride Sub PreparaSpoiler()
Public MustOverride Sub PreparaUConnect()
Public MustOverride Sub PreparaQuemacocos()
Public MustOverride Sub PreparaFarosDeNiebla()
End Class
Friend Class Avenger20SEMTX
Inherits ConstructorDeDodgeAvenger
Public Overrides Sub PreparaBocinas()
MyBase.Avenger.ConfiguraBocinas(NumeroDeBocinas.Cuatro)
End Sub
Public Overrides Sub PreparaEstereo()
MyBase.Avenger.ConfiguraEstereo(TipoDeEstereo.AM_FM_CD_MP3)
End Sub
Public Overrides Sub PreparaFarosDeNiebla()
MyBase.Avenger.ConfiguraFarosDeNiebla(False)
End Sub
Public Overrides Sub PreparaMotor()
MyBase.Avenger.ConfiguraMotor(TipoMotor._1998_4cil_16valvulasDOHC)
End Sub
Public Overrides Sub PreparaPotencia()
MyBase.Avenger.ConfiguraPotencia(Potencia._158HP_6400rpm)
End Sub
Public Overrides Sub PreparaQuemacocos()
MyBase.Avenger.ConfiguraQuemacocos(False)
End Sub
Public Overrides Sub PreparaRines()
MyBase.Avenger.ConfiguraRines(TipoDeRines.Acero17)
End Sub
Public Overrides Sub PreparaSpoiler()
MyBase.Avenger.ConfiguraSpoiler(False)
End Sub
Public Overrides Sub PreparaTorque()
MyBase.Avenger.ConfiguraTorque(Torque._141Lb_Ft_5000rpm)
End Sub
Public Overrides Sub PreparaTransmision()
MyBase.Avenger.ConfiguraTransmision(Transmision.Manual5Velocidades)
End Sub
Public Overrides Sub PreparaUConnect()
MyBase.Avenger.ConfiguraUConnect(False)
End Sub
Public Overrides Sub PreparaVolante()
MyBase.Avenger.ConfiguraVolante(TipoDeVolante.Plastico_AjusteInclinacion_AjusteTelescopico)
End Sub
End Class
Friend Class Avenger24SEATX
Inherits ConstructorDeDodgeAvenger
Public Overrides Sub PreparaBocinas()
MyBase.Avenger.ConfiguraBocinas(NumeroDeBocinas.Cuatro)
End Sub
Public Overrides Sub PreparaEstereo()
MyBase.Avenger.ConfiguraEstereo(TipoDeEstereo.AM_FM_CD_MP3)
End Sub
Public Overrides Sub PreparaFarosDeNiebla()
MyBase.Avenger.ConfiguraFarosDeNiebla(False)
End Sub
Public Overrides Sub PreparaMotor()
MyBase.Avenger.ConfiguraMotor(TipoMotor._2360_4cil_16valvulasDOHC)
End Sub
Public Overrides Sub PreparaPotencia()
MyBase.Avenger.ConfiguraPotencia(Potencia._172HP_6000rpm)
End Sub
Public Overrides Sub PreparaQuemacocos()
MyBase.Avenger.ConfiguraQuemacocos(False)
End Sub
Public Overrides Sub PreparaRines()
MyBase.Avenger.ConfiguraRines(TipoDeRines.Acero17)
End Sub
Public Overrides Sub PreparaSpoiler()
MyBase.Avenger.ConfiguraSpoiler(False)
End Sub
Public Overrides Sub PreparaTorque()
MyBase.Avenger.ConfiguraTorque(Torque._165Lb_Ft_4400rpm)
End Sub
Public Overrides Sub PreparaTransmision()
MyBase.Avenger.ConfiguraTransmision(Transmision.Automatica4Velocidades)
End Sub
Public Overrides Sub PreparaUConnect()
MyBase.Avenger.ConfiguraUConnect(False)
End Sub
Public Overrides Sub PreparaVolante()
MyBase.Avenger.ConfiguraVolante(TipoDeVolante.Plastico_AjusteInclinacion_AjusteTelescopico)
End Sub
End Class
Friend Class Avenger24SXTATX
Inherits ConstructorDeDodgeAvenger
Public Overrides Sub PreparaBocinas()
MyBase.Avenger.ConfiguraBocinas(NumeroDeBocinas.Seis)
End Sub
Public Overrides Sub PreparaEstereo()
MyBase.Avenger.ConfiguraEstereo(TipoDeEstereo.AM_FM_CD_MP3_ControlDeAudioEnElVolante)
End Sub
Public Overrides Sub PreparaFarosDeNiebla()
MyBase.Avenger.ConfiguraFarosDeNiebla(False)
End Sub
Public Overrides Sub PreparaMotor()
MyBase.Avenger.ConfiguraMotor(TipoMotor._2360_4cil_16valvulasDOHC)
End Sub
Public Overrides Sub PreparaPotencia()
MyBase.Avenger.ConfiguraPotencia(Potencia._172HP_6000rpm)
End Sub
Public Overrides Sub PreparaQuemacocos()
MyBase.Avenger.ConfiguraQuemacocos(False)
End Sub
Public Overrides Sub PreparaRines()
MyBase.Avenger.ConfiguraRines(TipoDeRines.Aluminio17)
End Sub
Public Overrides Sub PreparaSpoiler()
MyBase.Avenger.ConfiguraSpoiler(False)
End Sub
Public Overrides Sub PreparaTorque()
MyBase.Avenger.ConfiguraTorque(Torque._165Lb_Ft_4400rpm)
End Sub
Public Overrides Sub PreparaTransmision()
MyBase.Avenger.ConfiguraTransmision(Transmision.Automatica4Velocidades)
End Sub
Public Overrides Sub PreparaUConnect()
MyBase.Avenger.ConfiguraUConnect(False)
End Sub
Public Overrides Sub PreparaVolante()
MyBase.Avenger.ConfiguraVolante(TipoDeVolante.Piel_AjusteInclinacion_AjusteTelescopico)
End Sub
End Class
Friend Class Avenger24SXTATXSport
Inherits ConstructorDeDodgeAvenger
Public Overrides Sub PreparaBocinas()
MyBase.Avenger.ConfiguraBocinas(NumeroDeBocinas.Seis)
End Sub
Public Overrides Sub PreparaEstereo()
MyBase.Avenger.ConfiguraEstereo(TipoDeEstereo.AM_FM_CD_MP3_ControlDeAudioEnElVolante)
End Sub
Public Overrides Sub PreparaFarosDeNiebla()
MyBase.Avenger.ConfiguraFarosDeNiebla(True)
End Sub
Public Overrides Sub PreparaMotor()
MyBase.Avenger.ConfiguraMotor(TipoMotor._2360_4cil_16valvulasDOHC)
End Sub
Public Overrides Sub PreparaPotencia()
MyBase.Avenger.ConfiguraPotencia(Potencia._172HP_6000rpm)
End Sub
Public Overrides Sub PreparaQuemacocos()
MyBase.Avenger.ConfiguraQuemacocos(True)
End Sub
Public Overrides Sub PreparaRines()
MyBase.Avenger.ConfiguraRines(TipoDeRines.Aluminio17)
End Sub
Public Overrides Sub PreparaSpoiler()
MyBase.Avenger.ConfiguraSpoiler(True)
End Sub
Public Overrides Sub PreparaTorque()
MyBase.Avenger.ConfiguraTorque(Torque._165Lb_Ft_4400rpm)
End Sub
Public Overrides Sub PreparaTransmision()
MyBase.Avenger.ConfiguraTransmision(Transmision.Automatica4Velocidades)
End Sub
Public Overrides Sub PreparaUConnect()
MyBase.Avenger.ConfiguraUConnect(True)
End Sub
Public Overrides Sub PreparaVolante()
MyBase.Avenger.ConfiguraVolante(TipoDeVolante.Piel_AjusteInclinacion_AjusteTelescopico)
End Sub
End Class
Friend Class Armadora
Private ConfiguradorAvenger As ConstructorDeDodgeAvenger
Public Sub ConfiguradorDeConstructorDeDodgeAvenger(ByVal Configuracion As ConstructorDeDodgeAvenger)
Me.ConfiguradorAvenger = Configuracion
End Sub
Public Function ObtenerAvenger() As DodgeAvenger
Return Me.ConfiguradorAvenger.ObtenerAvenger()
End Function
Public Sub ConfigurarAvenger()
Me.ConfiguradorAvenger.CreaNuevoAvenger()
Me.ConfiguradorAvenger.PreparaBocinas()
Me.ConfiguradorAvenger.PreparaEstereo()
Me.ConfiguradorAvenger.PreparaFarosDeNiebla()
Me.ConfiguradorAvenger.PreparaMotor()
Me.ConfiguradorAvenger.PreparaPotencia()
Me.ConfiguradorAvenger.PreparaQuemacocos()
Me.ConfiguradorAvenger.PreparaRines()
Me.ConfiguradorAvenger.PreparaSpoiler()
Me.ConfiguradorAvenger.PreparaTorque()
Me.ConfiguradorAvenger.PreparaTransmision()
Me.ConfiguradorAvenger.PreparaUConnect()
Me.ConfiguradorAvenger.PreparaVolante()
End Sub
End Class
Friend Class Agencia
Public Sub MetodoDeLlamado()
Dim MiAgencia As Armadora = New Armadora()
Dim ConfiguradorAvenger20SEMTX As New Avenger20SEMTX()
Dim ConfiguradorAvenger24SEATX As New Avenger24SEATX()
Dim ConfiguradorAvenger24SXTATX As New Avenger24SXTATX()
Dim ConfiguradorAvenger24SXTATXSport As New Avenger24SXTATXSport()
MiAgencia.ConfiguradorDeConstructorDeDodgeAvenger(ConfiguradorAvenger24SXTATXSport)
MiAgencia.ConfigurarAvenger()
Dim AutoConfigurado As DodgeAvenger = MiAgencia.ObtenerAvenger()
End Sub
End Class
End Namespace
C#
using System;
using System.Collections.Generic;
using System.Text;
namespace Patrones{
public enum NumeroDeBocinas
{
Cuatro = 4,
Seis = 6
}
public enum Potencia
{
_158HP_6400rpm,
_172HP_6000rpm
}
public enum TipoDeEstereo
{
AM_FM_CD_MP3,
AM_FM_CD_MP3_ControlDeAudioEnElVolante
}
public enum TipoDeRines
{
Acero17,
Aluminio17
}
public enum TipoDeVolante
{
Plastico_AjusteInclinacion_AjusteTelescopico,
Piel_AjusteInclinacion_AjusteTelescopico
}
public enum TipoMotor
{
_1998_4cil_16valvulasDOHC,
_2360_4cil_16valvulasDOHC
}
public enum Torque
{
_141Lb_Ft_5000rpm,
_165Lb_Ft_4400rpm
}
public enum Transmision
{
Manual5Velocidades,
Automatica4Velocidades
}
public class DodgeAvenger
{
private string _Acabados = "Imitación aluminio en la palanca de cambios e imitación titanio en las puertas";
private bool _AireAcondicionado = true;
private NumeroDeBocinas _Bocinas;
private string _BolsasDeAire = "Conductor y pasajero";
private bool _ControlDeVelocidad = true;
private string _Cristales = "Electricos";
private string _Direccion = "Hidráulica";
private TipoDeEstereo _Estereo;
private bool _FarosDeNiebla;
private string _Frenos = "2 De disco 2 ventilados delanteros";
private bool _InmovilizadorElectronicoMotor = true;
private TipoMotor _Motor;
private Potencia _Potencia;
private bool _Quemacocos;
private string _Retrovisores = "Eléctricos";
private TipoDeRines _Rines;
private string _Seguros = "Eléctricos a control remoto";
private bool _Spoiler;
private Torque _Torque;
private Transmision _Transmision;
private bool _UConnect;
private string _Vestiduras = "Tela";
private TipoDeVolante _Volante;
public void ConfiguraBocinas(NumeroDeBocinas bocinas)
{
this._Bocinas = bocinas;
}
public void ConfiguraEstereo(TipoDeEstereo estereo)
{
this._Estereo = estereo;
}
public void ConfiguraFarosDeNiebla(bool farosDeNiebla)
{
this._FarosDeNiebla = farosDeNiebla;
}
public void ConfiguraMotor(TipoMotor motor)
{
this._Motor = motor;
}
public void ConfiguraPotencia(Potencia potencia)
{
this._Potencia = potencia;
}
public void ConfiguraQuemacocos(bool quemaCocos)
{
this._Quemacocos = quemaCocos;
}
public void ConfiguraRines(TipoDeRines rines)
{
this._Rines = rines;
}
public void ConfiguraSpoiler(bool spoiler)
{
this._Spoiler = spoiler;
}
public void ConfiguraTorque(Torque torque)
{
this._Torque = torque;
}
public void ConfiguraTransmision(Transmision transmision)
{
this._Transmision = transmision;
}
public void ConfiguraUConnect(bool uConnect)
{
this._UConnect = uConnect;
}
public void ConfiguraVolante(TipoDeVolante volante)
{
this._Volante = volante;
}
}
internal abstract class ConstructorDeDodgeAvenger
{
protected DodgeAvenger Avenger;
public void CreaNuevoAvenger()
{
this.Avenger = new DodgeAvenger();
}
public DodgeAvenger ObtenerAvenger()
{
return this.Avenger;
}
public abstract void PreparaBocinas();
public abstract void PreparaEstereo();
public abstract void PreparaFarosDeNiebla();
public abstract void PreparaMotor();
public abstract void PreparaPotencia();
public abstract void PreparaQuemacocos();
public abstract void PreparaRines();
public abstract void PreparaSpoiler();
public abstract void PreparaTorque();
public abstract void PreparaTransmision();
public abstract void PreparaUConnect();
public abstract void PreparaVolante();
}
internal class Avenger20SEMTX : ConstructorDeDodgeAvenger
{
public override void PreparaBocinas()
{
base.Avenger.ConfiguraBocinas(NumeroDeBocinas.Cuatro);
}
public override void PreparaEstereo()
{
base.Avenger.ConfiguraEstereo(TipoDeEstereo.AM_FM_CD_MP3);
}
public override void PreparaFarosDeNiebla()
{
base.Avenger.ConfiguraFarosDeNiebla(false);
}
public override void PreparaMotor()
{
base.Avenger.ConfiguraMotor(TipoMotor._1998_4cil_16valvulasDOHC);
}
public override void PreparaPotencia()
{
base.Avenger.ConfiguraPotencia(Potencia._158HP_6400rpm);
}
public override void PreparaQuemacocos()
{
base.Avenger.ConfiguraQuemacocos(false);
}
public override void PreparaRines()
{
base.Avenger.ConfiguraRines(TipoDeRines.Acero17);
}
public override void PreparaSpoiler()
{
base.Avenger.ConfiguraSpoiler(false);
}
public override void PreparaTorque()
{
base.Avenger.ConfiguraTorque(Torque._141Lb_Ft_5000rpm);
}
public override void PreparaTransmision()
{
base.Avenger.ConfiguraTransmision(Transmision.Manual5Velocidades);
}
public override void PreparaUConnect()
{
base.Avenger.ConfiguraUConnect(false);
}
public override void PreparaVolante()
{
base.Avenger.ConfiguraVolante(TipoDeVolante.Plastico_AjusteInclinacion_AjusteTelescopico);
}
}
internal class Avenger24SEATX : ConstructorDeDodgeAvenger
{
public override void PreparaBocinas()
{
base.Avenger.ConfiguraBocinas(NumeroDeBocinas.Cuatro);
}
public override void PreparaEstereo()
{
base.Avenger.ConfiguraEstereo(TipoDeEstereo.AM_FM_CD_MP3);
}
public override void PreparaFarosDeNiebla()
{
base.Avenger.ConfiguraFarosDeNiebla(false);
}
public override void PreparaMotor()
{
base.Avenger.ConfiguraMotor(TipoMotor._2360_4cil_16valvulasDOHC);
}
public override void PreparaPotencia()
{
base.Avenger.ConfiguraPotencia(Potencia._172HP_6000rpm);
}
public override void PreparaQuemacocos()
{
base.Avenger.ConfiguraQuemacocos(false);
}
public override void PreparaRines()
{
base.Avenger.ConfiguraRines(TipoDeRines.Acero17);
}
public override void PreparaSpoiler()
{
base.Avenger.ConfiguraSpoiler(false);
}
public override void PreparaTorque()
{
base.Avenger.ConfiguraTorque(Torque._165Lb_Ft_4400rpm);
}
public override void PreparaTransmision()
{
base.Avenger.ConfiguraTransmision(Transmision.Automatica4Velocidades);
}
public override void PreparaUConnect()
{
base.Avenger.ConfiguraUConnect(false);
}
public override void PreparaVolante()
{
base.Avenger.ConfiguraVolante(TipoDeVolante.Plastico_AjusteInclinacion_AjusteTelescopico);
}
}
internal class Avenger24SXTATX : ConstructorDeDodgeAvenger
{
public override void PreparaBocinas()
{
base.Avenger.ConfiguraBocinas(NumeroDeBocinas.Seis);
}
public override void PreparaEstereo()
{
base.Avenger.ConfiguraEstereo(TipoDeEstereo.AM_FM_CD_MP3_ControlDeAudioEnElVolante);
}
public override void PreparaFarosDeNiebla()
{
base.Avenger.ConfiguraFarosDeNiebla(false);
}
public override void PreparaMotor()
{
base.Avenger.ConfiguraMotor(TipoMotor._2360_4cil_16valvulasDOHC);
}
public override void PreparaPotencia()
{
base.Avenger.ConfiguraPotencia(Potencia._172HP_6000rpm);
}
public override void PreparaQuemacocos()
{
base.Avenger.ConfiguraQuemacocos(false);
}
public override void PreparaRines()
{
base.Avenger.ConfiguraRines(TipoDeRines.Aluminio17);
}
public override void PreparaSpoiler()
{
base.Avenger.ConfiguraSpoiler(false);
}
public override void PreparaTorque()
{
base.Avenger.ConfiguraTorque(Torque._165Lb_Ft_4400rpm);
}
public override void PreparaTransmision()
{
base.Avenger.ConfiguraTransmision(Transmision.Automatica4Velocidades);
}
public override void PreparaUConnect()
{
base.Avenger.ConfiguraUConnect(false);
}
public override void PreparaVolante()
{
base.Avenger.ConfiguraVolante(TipoDeVolante.Piel_AjusteInclinacion_AjusteTelescopico);
}
}
internal class Avenger24SXTATXSport : ConstructorDeDodgeAvenger
{
public override void PreparaBocinas()
{
base.Avenger.ConfiguraBocinas(NumeroDeBocinas.Seis);
}
public override void PreparaEstereo()
{
base.Avenger.ConfiguraEstereo(TipoDeEstereo.AM_FM_CD_MP3_ControlDeAudioEnElVolante);
}
public override void PreparaFarosDeNiebla()
{
base.Avenger.ConfiguraFarosDeNiebla(true);
}
public override void PreparaMotor()
{
base.Avenger.ConfiguraMotor(TipoMotor._2360_4cil_16valvulasDOHC);
}
public override void PreparaPotencia()
{
base.Avenger.ConfiguraPotencia(Potencia._172HP_6000rpm);
}
public override void PreparaQuemacocos()
{
base.Avenger.ConfiguraQuemacocos(true);
}
public override void PreparaRines()
{
base.Avenger.ConfiguraRines(TipoDeRines.Aluminio17);
}
public override void PreparaSpoiler()
{
base.Avenger.ConfiguraSpoiler(true);
}
public override void PreparaTorque()
{
base.Avenger.ConfiguraTorque(Torque._165Lb_Ft_4400rpm);
}
public override void PreparaTransmision()
{
base.Avenger.ConfiguraTransmision(Transmision.Automatica4Velocidades);
}
public override void PreparaUConnect()
{
base.Avenger.ConfiguraUConnect(true);
}
public override void PreparaVolante()
{
base.Avenger.ConfiguraVolante(TipoDeVolante.Piel_AjusteInclinacion_AjusteTelescopico);
}
}
internal class Armadora
{
private ConstructorDeDodgeAvenger ConfiguradorAvenger;
public void ConfiguradorDeConstructorDeDodgeAvenger(ConstructorDeDodgeAvenger Configuracion)
{
this.ConfiguradorAvenger = Configuracion;
}
public void ConfigurarAvenger()
{
this.ConfiguradorAvenger.CreaNuevoAvenger();
this.ConfiguradorAvenger.PreparaBocinas();
this.ConfiguradorAvenger.PreparaEstereo();
this.ConfiguradorAvenger.PreparaFarosDeNiebla();
this.ConfiguradorAvenger.PreparaMotor();
this.ConfiguradorAvenger.PreparaPotencia();
this.ConfiguradorAvenger.PreparaQuemacocos();
this.ConfiguradorAvenger.PreparaRines();
this.ConfiguradorAvenger.PreparaSpoiler();
this.ConfiguradorAvenger.PreparaTorque();
this.ConfiguradorAvenger.PreparaTransmision();
this.ConfiguradorAvenger.PreparaUConnect();
this.ConfiguradorAvenger.PreparaVolante();
}
public DodgeAvenger ObtenerAvenger()
{
return this.ConfiguradorAvenger.ObtenerAvenger();
}
}
internal class Agencia
{
public void MetodoDeLlamado()
{
Armadora MiAgencia = new Armadora();
Avenger20SEMTX ConfiguradorAvenger20SEMTX = new Avenger20SEMTX();
Avenger24SEATX ConfiguradorAvenger24SEATX = new Avenger24SEATX();
Avenger24SXTATX ConfiguradorAvenger24SXTATX = new Avenger24SXTATX();
Avenger24SXTATXSport ConfiguradorAvenger24SXTATXSport = new Avenger24SXTATXSport();
MiAgencia.ConfiguradorDeConstructorDeDodgeAvenger(ConfiguradorAvenger24SXTATXSport);
MiAgencia.ConfigurarAvenger();
DodgeAvenger AutoConfigurado = MiAgencia.ObtenerAvenger();
}
}
}
Usos conocidos
Ejemplos de usos conocidos son por ejemplo un parser (Director) que tome un constructor como parámetro, genere la notificación al constructor cada que reconozca una construcción válida y rerese el resultado al cliente; generar un constructor que sea producto y director al mismo tiempo y que pueda construír a partir de sus propios cambios de parámetros.
Patrones relacionados
Fabrica abstracta, Combinación
Etiquetas: .NET Básico, Arquitectura de software », Buenas prácticas, C Sharp », Fiabilidad y manejabilidad », VB
Patrones y antipatrones de arquitectura: Constructor
Escrito por Alfonso Lara Ramos @ 17:47 0 comentarios 

|
|
|
|
|
|
|
|
|
|
|
| 
Contenidos relacionados: Google, Live Search, Tafiti, Yahoo
20070622
Te extiendo la invitación para que ingreses al Expert Zone, un evento online para Profesionales de TI y Desarrolladores de software, que tiene como proposito facilitar el intercambio de ideas y conocimientos. Esta conferencia utilizara una plataforma virtual que te conecta con expertos de toda la region sin importar tu ubicacion geografica, por lo que lo unico que necesitas para participar es una conexion a Internet desde tu trabajo o residencia.

Sitio Web de Expert Zone 2007
Etiquetas: Aplicaciones Web », Aplicaciones Windows », Arquitectura de software », Buenas prácticas, Certificación Microsoft », Comunidad, Novedades tecnológicas, Visual Studio », Windows Vista »
Expert Zone 2007
Escrito por Alfonso Lara Ramos @ 15:00 0 comentarios 

|
|
|
|
|
|
|
|
|
|
|
| 
Contenidos relacionados: Google, Live Search, Tafiti, Yahoo
20070607

SQL Server 2008 tiene mejoras en cuanto a la seguridad, confiabilidad, manejabilidad y escalabilidad con respecto a sus antecesores, una de las características anunciadas por Microsoft en esta nueva edición incluyen el que se puedan consumir datos de cualquier tipo en cualquier dispositivo.
Esto se logra permitiendo el almacenamiento en la base de datos de cualquier tipo de información imaginable, desde XML (que ya habíamos visto en SQL 2005) hasta documentos de cualquier formato.
Brinda capacidades de Inteligencia de negocio nuevas que son más fáciles de utilizar para cualquier usuario ya que se integra con Microsoft Office, permitiendo de esta manera crear tanto reportes internos para las organizaciones como también para los clientes su publicación externa.
En cuanto al desarrollo continúa su integración con Visual Studio (al estilo de "Orcas" por supuesto), esta vez con las nuevas especificaciones de C# y VB a partir de LINQ puede ser que se integre totalmente haciendo uso de tipos de objetos tales como el nuevo "Base de datos".
Los servicios de publicación y suscripción se han simplificado de manera notable.
El CTP de junio de SQL 2008 se encuentra ya disponible en el sitio Web de Connect.
En el sitio Web oficial de SQL 2008 pueden encontrar ya información interesante sobre esta nueva versión, además les dejo la liga para el Whitepaper de SQL Server 2008 y el comunicado de prensa que lo anunció. Yo ya estoy probando la versión de 64 bits para desarrolladores y me parece interesante la facilidad de uso de la nueva interface y ya les contaré de las nuevas herramientas.
Etiquetas: C Sharp », Inteligencia de negocios », Microsoft Office System », Novedades tecnológicas, SQL Server », VB
SQL Server 2008 Code Name: Katmai June CTP
Escrito por Alfonso Lara Ramos @ 23:54 0 comentarios 

|
|
|
|
|
|
|
|
|
|
|
| 
Contenidos relacionados: Google, Live Search, Tafiti, Yahoo
20070603
Ya puedes descargar la nueva version de Windows Live Messenger 8.5 desde los siguientes enlaces:
El diseño es más estilo Windows Vista, algo que me gustó es que ahora los botones de ventana (minimizar, maximizar/restaurar y cerrar) funcionan directamente sobre la ventana y no en el mapa de bits que lo venían haciendo en versiones anteriores. Tiene una mayor integración con los otros servicios de Windows Live como Windows Live OneCare Family Safety, que es una funcion que permite a los padres tener cierto control sobre cómo sus hijos se conectan, añaden nuevos contactos y platican con los demás. La instalación es más sencilla, la única opción es elegir si quieres que MSN sea tu página principal, lo cual me pareció muy cómodo puesto que anteriormente tenías que quitar otros tres checkboxes si no querías otra cosa que el Windows Live Messenger instalado en tu equipo.




Etiquetas: Live Communications », Novedades tecnológicas
Descarga de Windows Live Messenger 8.5 Beta
Escrito por Alfonso Lara Ramos @ 12:00 0 comentarios 

|
|
|
|
|
|
|
|
|
|
|
| 
Contenidos relacionados: Google, Live Search, Tafiti, Yahoo