Ho pubblicato questa domanda su Stack Overflow e alcune persone hanno suggerito di postarla qui.
Capisco sia il modello di metodo factory che factory. Nello schema factory creiamo dinamicamente una mia classe classificata da un'altra funzione di classe, dove passo qualche parametro a un'altra funzione di classe e in base a quel parametro un'altra funzione di classe restituisce l'istanza di classe giusta.
Nel modello di metodo di fabbrica dobbiamo procedere con un ulteriore passaggio. Nella sottoclasse del modello metodo factory creare l'istanza della mia classe. Non trovo uno scenario in cui le persone debbano seguire un modello di metodo di fabbrica. Quindi, per favore qualcuno viene con uno scenario in cui il normale modello di fabbrica non verrà utilizzato, piuttosto che le persone preferiscono utilizzare il metodo del metodo di fabbrica.
Qui sto postando due serie di codice prima una per modello di fabbrica e una seconda per modello di metodo di fabbrica
Primo set di codice in cui è stato utilizzato lo schema di fabbrica:
public enum Shipper
{
UPS = 1,
FedEx = 2,
Purolator = 3
}
public interface IShip
{
void Ship();
}
public class ShipperPurolator : IShip
{
public void Ship()
{
//-- code logic to implement shipping method for Purolator
MessageBox.Show("Purolator ship start");
}
}
public class ShipperUPS : IShip
{
public void Ship()
{
//-- code logic to implement shipping method for Purolator
MessageBox.Show("UPS ship start");
}
}
public class ShipperFexEx : IShip
{
public void Ship()
{
//-- code logic to implement shipping method for Purolator
MessageBox.Show("FedEx ship start");
}
}
public class ShipperFactory
{
public static IShip CreateInstance(Shipper enumModuleName)
{
IShip objActivity = null;
switch (enumModuleName)
{
case Shipper.UPS:
objActivity = new ShipperUPS();
break;
case Shipper.FedEx:
objActivity = new ShipperFexEx();
break;
case Shipper.Purolator:
objActivity = new ShipperPurolator();
break;
default:
break;
}
return objActivity;
}
}
Chiamando in questo modo:
IShip objActivity = null;
private void btnUPS_Click(object sender, EventArgs e)
{
objActivity = ShipperFactory.CreateInstance(Shipper.UPS);
objActivity.Ship();
}
private void btnFedEx_Click(object sender, EventArgs e)
{
objActivity = ShipperFactory.CreateInstance(Shipper.FedEx);
objActivity.Ship();
}
private void btnPurolator_Click(object sender, EventArgs e)
{
objActivity = ShipperFactory.CreateInstance(Shipper.Purolator);
objActivity.Ship();
}
Ora la stessa cosa è stata eseguita con lo schema dei metodi di produzione in cui devo scrivere altro codice per completare il lavoro
public interface IShip
{
void Ship();
}
public class ShipperPurolator : IShip
{
public void Ship()
{
//-- code logic to implement shipping method for Purolator
MessageBox.Show("Purolator ship start");
}
}
public class ShipperUPS : IShip
{
public void Ship()
{
//-- code logic to implement shipping method for Purolator
MessageBox.Show("UPS ship start");
}
}
public class ShipperFedEx : IShip
{
public void Ship()
{
//-- code logic to implement shipping method for Purolator
MessageBox.Show("FedEx ship start");
}
}
Inizio della classe di fabbrica:
public interface IShipFactory
{
IShip GetShipper();
}
public class ShipperFexExFactory : IShipFactory
{
public IShip GetShipper()
{
//-- code logic to implement shipping method for Purolator
//MessageBox.Show("FedEx ship start");
return new ShipperFedEx();
}
}
public class ShipperUPSFactory : IShipFactory
{
public IShip GetShipper()
{
//-- code logic to implement shipping method for Purolator
return new ShipperUPS();
}
}
public class ShipperPurolatorFactory : IShipFactory
{
public IShip GetShipper()
{
//-- code logic to implement shipping method for Purolator
return new ShipperPurolator();
}
}
Chiamando in questo modo:
IShipFactory _IShipFactory = null;
private void btnUPS_Click(object sender, EventArgs e)
{
_IShipFactory = new ShipperUPSFactory();
_IShipFactory.GetShipper().Ship();
}
private void btnFedEx_Click(object sender, EventArgs e)
{
_IShipFactory = new ShipperFexExFactory();
_IShipFactory.GetShipper().Ship();
}
private void btnPurolator_Click(object sender, EventArgs e)
{
_IShipFactory = new ShipperPurolatorFactory();
_IShipFactory.GetShipper().Ship();
}
Qual è il metodo preferito per scegliere il modello di metodo di fabbrica?