mardi 7 novembre 2017

GOF Factory Method Pattern

I am reading about GOF Design Patterns and right now I am trying to understand Factory Method i.e. a Creational Design Pattern. What I understood from the definitions and examples is that this method makes sure that client is not exposed to logic behind creation of classes/Business Objects. Following are the two ways in which I see this Design Pattern has been implemented normally in examples over internet but I don't know which one is correct. The major difference is that one approach follows the concept of 'Product', 'Concrete Product', 'Creator' and 'Concrete Creator' but we have to make object of Factory / Concrete Creator class. In other approach I don't see any concept of 'Creator' and 'Concrete Creator' and so to say 'Concrete Creator' class has static factory method which can be directly called.

Which one is correct.

/// <summary>
///The 'Product' class
/// <summary>
public interface ICreditCard
{
    int CardType { get; set; }
    int CreditLimit { get; set; }
    int AnnualCharge { get; set; }
}

/// <summary>
///The 'Concrete Product' class
/// <summary>
public class SilverCreditCard : ICreditCard
{
    public int AnnualCharge { get; set; }

    public int CardType { get; set; }

    public int CreditLimit { get; set; }
}

/// <summary>
///The 'Concrete Product' class
/// <summary>
public class GoldCreditCard : ICreditCard
{
    public int AnnualCharge { get; set; }

    public int CardType { get; set; }

    public int CreditLimit { get; set; }
}

/// <summary>
///The 'Concrete Product' class
/// <summary>
public class PlatinumCreditCard : ICreditCard
{
    public int AnnualCharge { get; set; }

    public int CardType { get; set; }

    public int CreditLimit { get; set; }
}
/// <summary>
///The 'Creator' class or 'Concrete Creator' 
/// <summary>
public sealed class CreditCardFactory
{
    public static ICreditCard GetCreditCard(CreditCards cardType)
    {
        //ICreditCard creditCard = null;
        //switch (cardType)
        //{
        //    case CreditCards.Silver:
        //        creditCard = new SilverCreditCard();
        //        break;
        //    case CreditCards.Gold:
        //        creditCard = new GoldCreditCard();
        //        break;
        //    case CreditCards.Platinum:
        //        creditCard = new PlatinumCreditCard();
        //        break;
        //}
        //return creditCard;

        // Find the class
        Type creditCard = Type.GetType(cardType.ToString());

        // Get it's constructor
        ConstructorInfo constructor = creditCard.GetConstructor(new Type[] { });

        // Invoke it's constructor, which returns an instance.
        ICreditCard createdObject = (ICreditCard)constructor.Invoke(null);

        // Pass back the instance as a CreditCard
        return createdObject;
    }
}
------------------------------OR----------------------------------------
    /// <summary>
    ///The 'Creator' class
    /// <summary>
public interface ICreditCardFactory
{
    ICreditCard GetCreditCard(CreditCards cardType);
}

//This can be interface or abstract class as well.
/// <summary>
///The 'Concrete Creator' class
/// <summary>
public class CreditCardFactory : ICreditCardFactory
{
    public ICreditCard GetCreditCard(CreditCards cardType)
    {
        //ICreditCard creditCard = null;
        //switch (cardType)
        //{
        //    case CreditCards.Silver:
        //        creditCard = new SilverCreditCard();
        //        break;
        //    case CreditCards.Gold:
        //        creditCard = new GoldCreditCard();
        //        break;
        //    case CreditCards.Platinum:
        //        creditCard = new PlatinumCreditCard();
        //        break;
        //}
        //return creditCard;

        // Find the class
        Type creditCard = Type.GetType(cardType.ToString());

        // Get it's constructor
        ConstructorInfo constructor = creditCard.GetConstructor(new Type[] { });

        // Invoke it's constructor, which returns an instance.
        ICreditCard createdObject = (ICreditCard)constructor.Invoke(null);

        // Pass back the instance as a CreditCard
        return createdObject;
    }
}

public enum CreditCards
{
    SilverCreditCard,
    GoldCreditCard,
    PlatinumCreditCard
}

//Client
    ICreditCard creditCard = CreditCardFactory.GetCreditCard(CreditCards.SilverCreditCard);
                creditCard.CardType = 1;
                creditCard.CreditLimit = 20000;
                creditCard.AnnualCharge = 0;
    ---------------------------OR-----------------------------------------
                CreditCardFactory creditCardFactory = new CreditCardFactory();
                ICreditCard creditCard = creditCardFactory.GetCreditCard(CreditCards.SilverCreditCard);
                creditCard.CardType = 1;
                creditCard.CreditLimit = 20000;
                creditCard.AnnualCharge = 0;

Aucun commentaire:

Enregistrer un commentaire