краткое описание шаблона дизайна фабрики - PullRequest
0 голосов
/ 28 октября 2010

У меня возникли проблемы с пониманием концепции фабричного дизайна.Насколько я понимаю, это позволяет вызывающему коду не беспокоиться о том, как создается отдельный объект, просто знать, что он будет реализовывать определенный интерфейс.

Я не вижу, как это сохраняет какой-либо код.

Например, если у меня было 3 типа транспортного средства

lorry, car, van

, и я создалкласс для каждого из них, я мог бы просто использовать оператор switch.В то время как с примерами фабричных классов, которые я видел до сих пор, я мог бы иметь интерфейс:

Interface vehicle {
    method drive();
}

, а затем класс:

Class vehiclefac implements vehicle {
    method createvehicle(type) {
     // choose car type and return
}    
}

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

Если кто-то может прояснить, что я не получаю, будьте очень благодарны, примеры в python особенно ценятся.

Ответы [ 6 ]

1 голос
/ 28 октября 2010

Шаблон фабричного метода - это Шаблон творчества .Его можно использовать для создания объектов определенного базового типа без указания точного конкретного типа, это определяется любым вводом и логикой создания внутри фабрики.

public class VehicleFactory
{
     public IVehicle Create(int noOfWheels)
     {
        if (noOfWheels == 1)
            return new UniCycle();
        if (noOfWheels == 2)
            return new MotorCycle();
        if (noOfWheels == 3)
            return new Trike();
        if (noOfWheels == 4)
            return new Car();

        throw new NotImplementedException();
    }
}

public class UniCycle : IVehcicle { ... }
public class MotorCycle: IVehcicle { ... }
public class Trike: IVehcicle { ... }
public class Car: IVehcicle { ... }

Ниже приведен простой пример C #используя идею вашего автомобиля в качестве основы.Полезность заключается в том, что любой потребительский код не заботится о том, что представляет собой конкретный класс, он просто возвращает IVehicle.Это не обязательно должно быть сделано с интерфейсами, все, хотя я предпочитаю их, это также может быть сделано с абстрактным базовым классом в зависимости от ситуации.

Когда я использую фабричный шаблон, у меня обычно есть фабричныйреализовать интерфейс, это называется Abstract Factory Pattern .В этом примере это будет что-то вроде:

public interface IVehicleFactory
{
    IVehicle Create(int noOfWheels);
}

Затем фабрика может быть внедрена в классы (см. IoC ).Все вместе это дает вам:

  • Отделение вашего кода.
  • Позволяет использовать различные реализации фабрики.
  • Потреблять очиститель кода, без создания объектов.
  • Модульное тестирование проще, меньше сложных конкретных классов, о которых нужно беспокоиться.

Ссылка на вики, предоставленная мной для Abstract Factory Pattern, содержит несколько примеров на Python.

1 голос
/ 28 октября 2010

Дело не в сокращении кода, а в разделении зависимостей. Если вы кодируете интерфейс и используете фабрику для извлечения ваших экземпляров, вам не нужно знать, какой конкретный класс вы используете. Если позже в проекте кто-то напишет альтернативную реализацию, фабрика может быть настроена на использование нового класса без изменения клиентов фабрики.

Например, представьте себе фабрику, которая создавала потоковые объекты для сериализации данных. Экземпляр может запросить интерфейс потока для сериализации. В зависимости от конфигурации или состояния, фабрика может быть настроена для предоставления экземпляров, которые записывают в файловую систему. В другом состоянии / конфигурации он может выдавать реализации сетевого потока. Заводская логика, которая выбирает правильную реализацию, может быть настолько простой или сложной, насколько этого требуют требования, но клиентскому коду не нужно ничего знать о различных реализациях.

В проекте не обязательно должно быть меньше кода, чтобы разрешить это, но код слабо связан и гораздо легче поддерживать.

0 голосов
/ 29 октября 2010

Шаблон фабричного метода является шаблоном Creational. Он инкапсулирует логику того, какую специализацию той же иерархии объектов следует создать для конкретного случая.

0 голосов
/ 28 октября 2010

Посмотрите здесь: Это шаблон создания фабричного метода? Они оспаривают вашу проблему.

0 голосов
/ 28 октября 2010

Думайте о фабрике как о «виртуальном конструкторе».Да, у вас должен быть общий интерфейс, и это статический тип возвращаемого объекта, но вы можете создать любой тип, если они реализуют этот общий интерфейс.

Что касается добавления новых подтипов, вы можетесделать это с отражением в языках, которые позволяют это.Я не знаю (пока), является ли Python одним из них.

0 голосов
/ 28 октября 2010

Заводская установка предназначена для герметизации логики переключения. Это означает, что вам не нужно беспокоиться о том, как автомобиль создается везде, где вам нужен автомобиль, и вам не нужно менять код где-либо, кроме заводских, при добавлении нового типа автомобиля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...