Looking for c# Keywords? Try Ask4Keywords

C# Language Заводская модель


пример

Фабричный метод - один из шаблонов дизайна. Он используется для решения проблемы создания объектов без указания точного типа результата. В этом документе вы научитесь правильно использовать Factory Method DP.

Позвольте мне объяснить вам это на простом примере. Представьте, что вы работаете на заводе, производящем три типа устройств - Амперметр, вольтметр и измеритель сопротивления. Вы пишете программу для центрального компьютера, которая будет создавать выбранное устройство, но вы не знаете окончательного решения своего начальника о том, что производить.

Давайте создадим IDevice интерфейса с некоторыми общими функциями, которые есть у всех устройств:

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

Теперь мы можем создавать классы, которые представляют наши устройства. Эти классы должны реализовывать интерфейс 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..."); }
}

Теперь мы должны определить фабричный метод. Давайте создадим класс DeviceFactory со статическим методом внутри:

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();
        }
    }
}

Большой! Давайте проверим наш код:

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();
    }
}

Это пример вывода, который вы можете увидеть после запуска этого кода:

AmMeter включается ...

36

6

33

43

24

AmMeter мигает огнями, прощаясь!

Вольтметр включается ...

102

-61

85

138

36

Вольтметр мигает огнями, прощаясь!

OhmMeter включается ...

723828

368536

685412

800266

578595

OhmMeter мигает огнями, прощаясь!