C# Language Modèle de méthode d'usine


Exemple

La méthode d'usine est l'un des modèles de conception créative. Il est utilisé pour résoudre le problème de la création d'objets sans spécifier le type de résultat exact. Ce document vous apprendra à utiliser correctement la méthode d'usine DP.

Laissez-moi vous en expliquer l'idée sur un exemple simple. Imaginez que vous travaillez dans une usine qui produit trois types d’appareils: un ampèremètre, un voltmètre et un compteur de résistance. Vous écrivez un programme pour un ordinateur central qui créera le périphérique sélectionné, mais vous ne connaissez pas la décision finale de votre patron sur ce qu'il doit produire.

Créons une interface IDevice avec des fonctions communes à tous les périphériques:

public interface IDevice
{
    int Measure();
    void TurnOff();
    void TurnOn();
}

Maintenant, nous pouvons créer des classes qui représentent nos appareils. Ces classes doivent implémenter l'interface IDevice :

public class AmMeter : IDevice
{
    private Random r = null;
    public AmMeter()
    {
        r = new Random();
    }
    public int Measure() { return r.Next(-25, 60); }
    public void TurnOff() { Console.WriteLine("AmMeter flashes lights saying good bye!"); }
    public void TurnOn() { Console.WriteLine("AmMeter turns on..."); }
}
public class OhmMeter : IDevice
{
    private Random r = null;
    public OhmMeter()
    {
        r = new Random();
    }
    public int Measure() { return r.Next(0, 1000000); }
    public void TurnOff() { Console.WriteLine("OhmMeter flashes lights saying good bye!"); }
    public void TurnOn() { Console.WriteLine("OhmMeter turns on..."); }
}
public class VoltMeter : IDevice
{
    private Random r = null;
    public VoltMeter()
    {
        r = new Random();
    }
    public int Measure() { return r.Next(-230, 230); }
    public void TurnOff() { Console.WriteLine("VoltMeter flashes lights saying good bye!"); }
    public void TurnOn() { Console.WriteLine("VoltMeter turns on..."); }
}

Maintenant, nous devons définir la méthode d'usine. Créons la classe DeviceFactory avec la méthode statique à l'intérieur:

public enum Device
{
    AM,
    VOLT,
    OHM
}
public class DeviceFactory
{
    public static IDevice CreateDevice(Device d)
    {
        switch(d)
        {
            case Device.AM: return new AmMeter();
            case Device.VOLT: return new VoltMeter();
            case Device.OHM: return new OhmMeter();
            default: return new AmMeter();
        }
    }
}

Génial! Testons notre code:

public class Program
{
    static void Main(string[] args)
    {
        IDevice device = DeviceFactory.CreateDevice(Device.AM);
        device.TurnOn();
        Console.WriteLine(device.Measure());
        Console.WriteLine(device.Measure());
        Console.WriteLine(device.Measure());
        Console.WriteLine(device.Measure());
        Console.WriteLine(device.Measure());
        device.TurnOff();
        Console.WriteLine();

        device = DeviceFactory.CreateDevice(Device.VOLT);
        device.TurnOn();
        Console.WriteLine(device.Measure());
        Console.WriteLine(device.Measure());
        Console.WriteLine(device.Measure());
        Console.WriteLine(device.Measure());
        Console.WriteLine(device.Measure());
        device.TurnOff();
        Console.WriteLine();

        device = DeviceFactory.CreateDevice(Device.OHM);
        device.TurnOn();
        Console.WriteLine(device.Measure());
        Console.WriteLine(device.Measure());
        Console.WriteLine(device.Measure());
        Console.WriteLine(device.Measure());
        Console.WriteLine(device.Measure());
        device.TurnOff();
        Console.WriteLine();
    }
}

Voici l'exemple de sortie que vous pourriez voir après avoir exécuté ce code:

AmMeter allume ...

36

6

33

43

24

AmMeter clignote des lumières en disant au revoir!

VoltMeter s'allume ...

102

-61

85

138

36

VoltMeter clignote des lumières disant au revoir!

OhmMeter allume ...

723828

368536

685412

800266

578595

OhmMeter clignote des lumières disant au revoir!