Подтвердить что ты не робот

Когда использовать шаблон метода Factory?

Когда использовать шаблон метода Factory?

Пожалуйста, предоставьте мне конкретную идею, когда использовать ее в проекте? и как это лучше по сравнению с новым ключевым словом?

4b9b3361

Ответ 1

Несмотря на то, что это не обязательно является основным, полезно для чего-то, где у вас есть специализированные экземпляры класса:

public ITax BuildNewSalesTax()
public ITax BuildNewValueAddedTax()

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

Ответ 2

У меня есть два случая, когда я склонен его использовать:

  • Объект должен быть инициализирован определенным образом
  • Когда я хочу построить определенный тип на основе абстрактного типа (абстрактный класс или интерфейс).

<сильные > Примеры:

  • Первый случай может заключаться в том, что вы хотите создать factory объекты SqlCommand, где вы автоматически присоединяете действительный SqlConnection перед возвратом объекта команды.

  • Во-вторых, если вы определили интерфейс и определили во время выполнения, точную реализацию используемого интерфейса (например, указав его в файле конфигурации).

Ответ 3

Используйте метод factory (не абстрактный factory), если вы хотите повторно использовать общие функции с различными компонентами.
Пример: Представьте, что у вас есть винтовка M16. Что-то вроде этого:

public class M16
{
    private Scope scope = new StandardScope();
    private SecondaryWeapon secondary = new Bayonet();
    private Camouflage camo = new DesertCamo();

    public double getMass()
    {
        // Add the mass of the gun to the mass of all the attachments.
    }

    public Point2D shootAtTarget(Point2D targetPosition)
    {
        // Very complicated calculation taking account of lots of variables such as
        // scope accuracy and gun weight.
    }
}

Вы можете быть удовлетворены этим некоторое время, думая, что вы не хотите ничего менять. Но тогда вам нужно сделать секретную миссию невидимости в джунглях, и вы понимаете, что ваши привязанности совершенно неуместны. Вам действительно нужна область NightVision, JungleComo и дополнительное оружие GrenageLauncher. Вам нужно будет скопировать код из оригинального M16...... не хорошая расширяемость..... Factory Method to rescue!

Перепишите свой класс M16:

public abstract class M16
{
    private Scope scope = getScope();
    private SecondaryWeapon secondary = getSecondaryWeapon();
    private Camouflage camo = getCamouflage();

    public double getMass()
    {
        // Add the mass of the gun to the mass of all the attachments.
    }

    public Point2D shootAtTarget(Point2D targetPosition)
    {
        // Very complicated calculation taking account of lots of variables such as
        // scope accuracy and gun weight.
    }

    // Don't have to be abstract if you want to have defaults.
    protected abstract Scope getScope();
    protected abstract SecondaryWeapon getSecondaryWeapon();
    protected abstract Camouflage getCamouflage();
}


//Then, your new JungleM16 can be created with hardly any effort (and importantly, no code //copying):

public class JungleM16 : M16
{
    public Scope getScope()
    {
        return new NightVisionScope();
    }

    public SecondaryWeapon getSecondaryWeapon()
    {
        return new GrenadeLauncher();
    }

    public Camouflage getCamouflage()
    {
        return new JungleCamo();
    }
}

Основная идея? Настраивайте и заменяйте составные объекты, сохраняя общую функциональность.

Фактически полезное место для его использования: Вы только что разработали действительно классный графический интерфейс, и у него действительно сложный макет. Было бы настоящей болью, если бы вы захотели иметь разные виджеты. Итак, используйте factory метод для создания виджетов. Затем, если вы передумаете (или кто-то другой хочет использовать ваш класс, но используйте разные компоненты), вы можете просто подклассифицировать GUI и переопределить методы factory.

Ответ 4

Вы можете обратиться к разделу 9.5 "Заводы из Руководства по разработке рамок" 2-го издания. Здесь приведен список руководств по использованию заводов над конструкторами:

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

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

DO используйте factory в случаях, когда a разработчик может не знать, какой тип для построения, например, при кодировании против базового типа или интерфейса.

CONSIDER с использованием factory, если имеется названный метод - единственный способ сделать операция понятна.

Используйте factory для стиля конверсии операции.

И из раздела 5.3 Конструктор Конструктор

CONSIDER, используя статический метод factory вместо конструктора, если семантика желаемой операции не сопоставляется непосредственно с конструкцией, нового экземпляра или в соответствии с инструкциями по дизайну конструктора чувствует себя неестественно.

Ответ 5

Я использую Factory pattens, когда

  • Когда класс не знает, какой класс объектов он должен создать.

  • Класс указывает свои подклассы, чтобы указать, какие объекты создавать.

  • В языке программистов (очень грубая форма) вы можете использовать шаблон Factory, где вам нужно создать объект любого из подклассов в зависимости от предоставленных данных.

Ответ 6

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

Подробнее см. следующую ссылку.

http://xeon2k.wordpress.com/2010/11/27/factory-method-pattern/

Ответ 7

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

Ответ 8

Чтобы ответить на вторую часть вашего вопроса, по моему мнению, я думаю, что причина этого лучше, чем ключевое слово "новое", заключается в том, что метод factory уменьшает зависимость от конструкторов определенных классов. Используя метод factory, вы делегируете создание объекта, о котором идет речь, кому-то другому, поэтому вызывающему не нужно знать, как создать объект.

Ответ 9

Лучше иметь шаблон метода factory против нового ключевого слова. Идея состоит в том, чтобы полностью перемещать объекты вне бизнес-логики. Этот принцип представляет собой проблему инъекции зависимостей. И работа метода factory может быть делегирована на платформу Injection Dependency, например, Spring.net или Castle Windsor в более поздней точке.

Ответ 10

Шаблон

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

Он позволяет подклассу решать, какой класс должен быть создан.

Рассмотрим следующий пример:

namespace TestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //Store is ordering the factory to get office shoes
            Shoe shoe = ShoeFactory.GetShoes("OFFICE");
            Console.WriteLine(shoe.GetType()); //Will be office shoes

            //Store is ordering the factory to get sports shoes
            shoe = ShoeFactory.GetShoes("SPORTS");
            Console.WriteLine(shoe.GetType()); //Will be sports shoes
        }
    }

    //This is the factory supplying shoes. It can supply sports shoes or office shoes
    //based on demand
    class ShoeFactory
    {
        public static Shoe GetShoes(string strShoeType)
        {
            switch (strShoeType)
            {
                case "SPORTS": return new SportShoe();
                    break;
                case "OFFICE": return new OfficeShoe();
                    break;
                default:
                    return null;
            }
        }
    }

    //This is an abstract class representing product family
    //In this example, its shoe
    public abstract class Shoe
    {

    }

    //Office shoe is a concrete class belongs to shoe family
    class OfficeShoe : Shoe
    {   

    }

    //Sports shoe is a concrete class belongs to shoe family
    class SportShoe : Shoe
    {

    }
}

Ответ 11

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

Я написал сообщение в блоге о том, почему я выбираю шаблон factory в своем проекте и, возможно, он может дать вам больше информации. Например, в PHP, но я считаю, что он применим в целом ко всем языкам.

http://www.mixedwaves.com/2009/02/implementing-factory-design-pattern/