реальный пример шаблона проектирования абстрактной фабрики в C # - PullRequest
0 голосов
/ 03 июля 2018

Я пишу этот вопрос после прочтения многих постов по шаблону Abstract Factory Design Pattern в C #. Я действительно не могу понять смысл использования в реальном мире из примеров, которые предоставляют все эти посты. Все, что я мог видеть, это какой-то простой пример автомобилей / компьютеров / телефонов и т. Д. Я понимаю, что они важны, чтобы дать простое объяснение. Но я действительно не могу сопоставить это с чем-то реальным, потому что, если бы я действительно следовал таким примерам, мой код менялся бы каждую вторую неделю, когда я хотел бы приносить новые объекты.

Ниже приведен пример кода для него

namespace ClassLibrary1
{

    public interface AbstractProductA { }
    public class ProductA1 : AbstractProductA { }
    public class ProductA2 : AbstractProductA { }


    public interface AbstractProductB { }
    public class ProductB1 : AbstractProductB { }
    public class ProductB2 : AbstractProductB { }


    public interface AbstractFactory
    {
        AbstractProductA CreateProductA();
        AbstractProductB CreateProductB();
    }


    public class ConcreteFactoryA : AbstractFactory
    {
        public AbstractProductA CreateProductA()
        {
            return new ProductA1();
        }

        public AbstractProductB CreateProductB()
        {
            return new ProductB1();
        }
    }

    public class ConcreteFactoryB : AbstractFactory
    {
        public AbstractProductA CreateProductA()
        {
            return new ProductA2();
        }

        public AbstractProductB CreateProductB()
        {
            return new ProductB2();
        }
    }

    public class Client
    {
        private AbstractProductA _productA;
        private AbstractProductB _productB;

        public Client(AbstractFactory factory)
        {
            _productA = factory.CreateProductA();
            _productB = factory.CreateProductB();
        }
    }

}

Теперь, как это понять. Я могу понять, как это работает, но выглядит так наивно. Одна вещь заключается в том, что, возможно, тот пример, который выбирают все на учебных сайтах, не является правильным.

Кроме того, какую пользу это действительно дает мне. Я могу сделать это обычным, не абстрактным, фабричным способом, используя интерфейсы, и все это будет работать нормально (с точки зрения дизайна).

Подробное объяснение с примером - вот что я ищу

1 Ответ

0 голосов
/ 11 июля 2018

Здесь я продемонстрирую вам следующий простой пример, основанный на том, что я использовал для реализации в своем проекте давным-давно.

public interface IBluetoothCommFactory { }

public interface IWifiCommFactory { }

/// <summary>
/// This is our base factory
/// </summary>
public interface ICommunicationBaseFactory
{
    IBluetoothCommFactory InitializeBluetoothCommunication();
    IWifiCommFactory InitializeWiFiCommnucation();
}

public class BluetoothCommunication : IBluetoothCommFactory
{
    public BluetoothCommunication()
    {
        // Implement some init logic here...
        Console.WriteLine("Bluetooth Communication was initialized");
     }
}

public class WiFiCommunication : IWifiCommFactory
{
    public WiFiCommunication()
    {
        // Implement some init logic here...
        Console.WriteLine("WIFI (generic) Communication was initialized");
    }
}

Выше приведены основные реализации «родовой» BluetoothCommunication и «универсальной» WiFiCommunication . Допустим, мы хотим создать продукт под названием ProductPrototypeONE , который использует эти общие типы связи.

public class ProductPrototypeONE : ICommunicationBaseFactory
{
    public IBluetoothCommFactory InitializeBluetoothCommunication()
    {
        return new BluetoothCommunication();
    }

    public IWifiCommFactory InitializeWiFiCommnucation()
    {
        return new WiFiCommunication();
    }
}

Тогда в нашем коде клиента:

ICommunicationBaseFactory baseFactory = new ProductPrototypeONE();
baseFactory.InitializeBluetoothCommunication();
baseFactory.InitializeWiFiCommnucation();

/* CONSOLE OUTPUT */  
Bluetooth Communication was initialized
WIFI (generic) Communication was initialized

Далее мы хотим добавить еще одно требование для создания продукта с типом Bluetooth Low Energy и некоторыми конкретными типами WiFi. Затем, с той же фабрикой, которую мы создали, мы можем продолжить реализовывать это:

public class BluetoothLowEnergyCommunication : IBluetoothCommFactory
{
    public BluetoothLowEnergyCommunication()
    {
        // Implement some init logic here...
        Console.WriteLine("Bluetooth Low Energy Communication was initialized");
    }
}

public class WiFiLowBandCommunication : IWifiCommFactory
{
    public WiFiLowBandCommunication()
    {
        // Implement some init logic here...
        Console.WriteLine("WIFI Low Band Communication was initialized");
    }
}

public class WifiHighBandCommunication : IWifiCommFactory
{
    public WifiHighBandCommunication()
    {
        // Implement some init logic here...
        Console.WriteLine("WIFI High Band Communication was initialized");
    }
}

Затем мы создали ProductPrototypeTWO как конкретный класс:

public enum BluetoothType
{
    CLASSIC_TYPE,
    BLE_TYPE
}

public enum WiFiType
{
    LOW_BAND,
    HIGH_BAND
}

public class ProductPrototypeTWO : ICommunicationBaseFactory
{
    private BluetoothType _bluetoothType;
    private WiFiType _wifiType;

    public ProductPrototypeTWO(BluetoothType bluetoothType, WiFiType wifiType)
    {
        _bluetoothType = bluetoothType;
        _wifiType = wifiType;
    }

    public IBluetoothCommFactory InitializeBluetoothCommunication()
    {
        switch (_bluetoothType)
        {
            case BluetoothType.CLASSIC_TYPE:
                return new BluetoothCommunication();
            case BluetoothType.BLE_TYPE:
                return new BluetoothLowEnergyCommunication();
            default:
                throw new NotSupportedException("Unknown Bluetooth type");
        }
    }

    public IWifiCommFactory InitializeWiFiCommnucation()
    {
        switch (_wifiType)
        {
            case WiFiType.LOW_BAND:
                return new WiFiLowBandCommunication();
            case WiFiType.HIGH_BAND:
                return new WifiHighBandCommunication();
            default:
                throw new NotSupportedException("Unknown WIFI type");
        }
    }
}

Наконец, код клиента:

ICommunicationBaseFactory baseFactory = new ProductPrototypeONE();
baseFactory.InitializeBluetoothCommunication();
baseFactory.InitializeWiFiCommnucation();

baseFactory = new ProductPrototypeTWO(BluetoothType.BLE_TYPE, WiFiType.HIGH_BAND);
baseFactory.InitializeBluetoothCommunication();
baseFactory.InitializeWiFiCommnucation();

Вот что у вас на выходе:

Bluetooth Communication was initialized
WIFI (generic) Communication was initialized
Bluetooth Low Energy Communication was initialized
WIFI High Band Communication was initialized
...