Вопрос о фабричном образце - PullRequest
0 голосов
/ 22 марта 2011

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

1) Создайте абстрактный класс, у которого есть метод, который переопределяется подклассами:

public abstract class EmployeeCreator
{
    public abstract Employee FactoryMethod();
}

public class DeveloperCreator : EmployeeCreator
{
    public override Employee FactoryMethod()
    {
        return new Developer();
    }
}

2) Создайте класс с одним фабричным методом:

public class EmployeeFactory
{
    public static Employee CreateEmployee(EmployeeType type)
    {
        if (type == EmployeeType.Developer)
            return new Developer();
        else
            return new Secretary();
    }
}

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

Но все еще используется фабричный шаблон?

Ответы [ 2 ]

4 голосов
/ 22 марта 2011

Ваш первый случай - это шаблон Abstract Factory , а второй - Factory Method .Это две разные модели, обе действительны и полезны.(На самом деле «фабричного шаблона» не существует - всякий раз, когда вы слышите этот термин, это ссылка на один из шаблонов, упомянутых выше.)

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

0 голосов
/ 22 марта 2011

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

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

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