Фабричный образец: Определение конкретного экземпляра класса фабрики? - PullRequest
3 голосов
/ 06 июня 2010

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

ЗАВОД

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace myNamespace
{
    public abstract class SourceFactory
    {
        abstract public UploadSource getUploadSource();
    }
    public class TextSourceFactory : SourceFactory
    {
        public override UploadSource getUploadSource()
        {
            return new TextUploadSource();
        }
    }
    public class XmlSourceFacotry : SourceFactory
    {
        public override UploadSource getUploadSource()
        {
            return new XmlUploadSource();
        }
    }
    public class SqlSourceFactory : SourceFactory
    {
        public override UploadSource getUploadSource()
        {
            return new SqlUploadSource();
        }
    }
}

КЛАССЫ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace myNamespace
{
    public abstract class UploadSource
    {
        abstract public void Execute();
    }
    public class TextUploadSource : UploadSource
    {
        public override void Execute()
        {
            Console.WriteLine("You executed a text upload source");
        }
    }
    public class XmlUploadSource : UploadSource
    {
        public override void Execute()
        {
            Console.WriteLine("You executed an XML upload source");
        }
    }
    public class SqlUploadSource : UploadSource
    {
        public override void Execute()
        {
            Console.WriteLine("You executed a SQL upload source");
        }
    }
}

1 Ответ

3 голосов
/ 06 июня 2010

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

Само по себе это не очень сложная логика; причина поместить это в класс загрузчика фабрики - возможность многократного использования. В вашем приложении может быть много фабрик, и часто большая часть кода загрузки фабрики довольно похожа, поэтому помещение его в отдельный класс (иерархию) исключает дублирование кода. И, конечно, логика может быть другой и более сложной, чем в этом примере.

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

...