jueves, 17 de julio de 2014

La tienda de animales I

Implementación de una tienda de animales utilizando los patrones de diseño GOF.


Si buscamos por Internet información sobre los patrones de diseño GOF existen multitud de ejemplos de su implementación. No voy a descubrir nada nuevo. Pero lo que voy a presentar es una implementación de varios patrones y mostrar cómo pueden funcionar juntos.

En este caso sólo haré uso de los patrones Creacionales para no complicar demasiado las cosas. Estos son los que se dedican a aspectos de creación de objetos, por decirlo llanamente. Su nombres son:  Abstract Factory, Builder,  Factory Method, Prototype, Singleton.

En dofactory hay una referencia muy buena de todos ellos por si queréis ampliar más.

Bueno vamos al lio.

Definición del sistema

El proyecto será implementar una tienda de animales. El sistema puede crear y gestionar dos tipos de tienda. Una se dedica a vender animales salvajes y otra animales domésticos. Aunque ahora ya no esté muy claro qué es un animal doméstico.

Los dos tipos de tienda pueden vender distintas categorias de animales: Reptil, Pájaro, Canes y Felinos.
Además, en determinadas épocas del año ofrece unos packs descuento a sus clientes con animales distintos.
Por último, para gestionar los datos de sus clientes dispone de la posibilidad de almacenar sus datos.

Diagrama de clases

A continuación aparece un diagrama de clases con las clases del sistema y su relación. Aparecen organizadas según el patrón de diseño que representan.


Justificación de los patrones elegidos y clases implicadas

  • Singleton: Este patrón se utiliza cuando sólo queremos tener una instancia de una clase. Es decir, queremos que se cree un sólo objeto.
    • PetShop: Es la clase principal que representa la tienda.

  • Abstract factory: Ya que queremos poder crear tiendas de animales domésticos o salvajes, se ha utilizado este patrón porque permite crear famillias de objetos y manejarlos de una forma uniforme. 
    • PetShopFactory: clase abstracta que contiene los métodos de creación de las familias de animales.
    • SavagePetShopFactory: implementa a PetShopFactory y creará las familias de animales salvajes.
    • HomePetShopFactory: implementa a PetShopFactory y creará las familias de animales domésticos.
    • Reptil, Bird, Canine, Feline: Son las clases que representan las familias de animales.
    • Aligator, Chamaleon, Eagle, Parrot, Dingo, Dog, Lion, Cat: Los animales que se pueden crear en cada familia.


  • Builder: Este patrón es ideal para crear objetos que tienen las mismas partes, pero su contenido o proceso de creación son diferentes. En el sistema formará el subsistema de los packs de temporada.
    • PackDirector: Es la clase que gestiona la creación de los packs.

    • PackBuilder: Es una clase abstracta que contiene los métodos necessarios para crear las partes de los packs.

    • ChristmasPack, EasterPack: Son las clases que implementan a PackPuilder y realizan la creación de todas las partes de cada pack siguiendo las reglas de creación apropiadas. Por ejemplo, en el primer pack sólo se admiten animales carnívoros.

    • Pack: Es la clase que representa a un pack genérico con la lista de sus partes.


  • Factory Method: Este patrón permite crear objetos compuestos por distintas clases que sólo se puede saber su tipo en tiempo de ejecución. En nuestro caso nos servirá para encargarse de los contactos de los clientes y proveedores de la tienda.
    • Contact: Es la clase abstracta que representa a un contacto de la tienda. Cada contacto puede tener información especifica.

    • Customer, Suplier: Son las clases que implementan a Contact y representan los dos tipos de contactos que se pueden tener.

    • Data: cada contacto puede almacenar información específica dependiendo de su tipo.

    • CompanyData, DiscountData: Esta información sólo la podrán tener los Suplier.

    • PersonalData, SalesData: Esta información sólo la podrán tener los Customer.  
  

Implementación

Lo primero que vamos a hacer es la clase principal PetShop y que debemos diseñar usando el patrón singleton.

Hay que colocar una propiedad estática que sea privada del mismo tipo de la clase y que será la única instancia de la clase.

private  static PetShop _petShop = null;


El constructor debe ser privado para que no se puedan crear instancias de esta clase desde fuera.

private PetShop() {}

Y tendremos un método que se encargará de crear una única instancia de la clase
        
public static PetShop Create()
{
     if (_petShop == null)
      _petShop = new PetShop();
 

  return _petShop;
}


Todo junto queda así:


public class PetShop
{
     private  static PetShop _petShop = null;
       
     public static PetShop Create()
     {
         if (_petShop == null)
             _petShop = new PetShop();

         return _petShop;
     }

     private PetShop()
     {
     } 


        
Hasta aquí la primera parte. Sigueme y podrás ver cómo se implementa el resto del sistema.

Hasta pronto.