Отдельный этап строительства из построенных фазы


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

В принципе у меня есть набор объектов, который должен быть преобразован в похожих (но разных) объектов. Преобразила я хочу быть в состоянии запроса позже.

Так что у меня PartitionedContainersBuilder, который имеет дело с частью трансформации и у меня PartitionedContainer который представляет преобразованный запрос-в состоянии.

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

Я бы предпочел иметь конструктор в PartitionedContainer делать работу, а не статическая сборка - это было бы лучше? Мое шестое чувство говорит "Да", но есть ощутимое преимущество?

public class PartitionedContainers {

static class PartitionedContainersBuilder
{
    private LogicalExcelAreaInterface buildLogicalExcelArea(ContainerNodeInterface pContainer, PapyrusInterface pPapyrus)
    {
        // TODO: introduce LeafItemContainer to remove if cases
        if (pContainer.getItem() != null) 
        {
            return pContainer.getItem().getLogicalExcelArea(pPapyrus);
        } else {
            return new MutableLogicalExcelArea(1, 1)
                        .withCellWidth(0, 0, pPapyrus.getWidth())
                        .withCellHeight(0, 0, pPapyrus.getHeight());
        }
    }

    public PartitionedContainers build(final ContainerNodeInterface pRootContainer, final Map<ContainerInterface, PapyrusInterface> pPapyrusFromContainer)
    {
        final Map<PartitionedContainerInterface, PapyrusInterface> lPapyrusFromContainer = new HashMap<PartitionedContainerInterface, PapyrusInterface>();
        final Map<ContainerNodeInterface, MutablePartitionedContainer> lPartitionedContainerFromContainer = new HashMap<ContainerNodeInterface, MutablePartitionedContainer>();

        for (final ContainerNodeInterface lNode : new NodeCollections<ContainerNodeInterface>().getAllSortedTopDown(pRootContainer))
        {
            lPartitionedContainerFromContainer.put(
                    lNode, 
                    new MutablePartitionedContainer(lNode.getElement(), buildLogicalExcelArea(lNode, pPapyrusFromContainer.get(lNode)))
            );
            if (!lNode.isRoot()) {
                lPartitionedContainerFromContainer.get(lNode).withParent(lPartitionedContainerFromContainer.get(lNode.getParent()));
                lPartitionedContainerFromContainer.get(lNode.getParent()).withAdditionalChild(lPartitionedContainerFromContainer.get(lNode));
            }   
            lPapyrusFromContainer.put(lPartitionedContainerFromContainer.get(lNode), pPapyrusFromContainer.get(lNode));
        }
        return new PartitionedContainers(lPartitionedContainerFromContainer.get(pRootContainer), lPapyrusFromContainer);
    }

}

PartitionedContainerInterface mRootContainer;
Map<PartitionedContainerInterface, PapyrusInterface> mPapyrusFromContainer;

private PartitionedContainers(PartitionedContainerInterface pRootContainer, Map<PartitionedContainerInterface, PapyrusInterface> pPapyrusFromContainer)
{
    mRootContainer = pRootContainer;
    mPapyrusFromContainer = pPapyrusFromContainer;
}

public PartitionedContainerInterface getRoot()
{
    return mRootContainer;
}

public static PartitionedContainers build(ContainerNodeInterface pRootContainer, final Map<ContainerInterface, PapyrusInterface> pPapyrusFromContainer)
{
    return new PartitionedContainersBuilder().build(pRootContainer, pPapyrusFromContainer);
}

public PapyrusInterface getPapyrusFromContainer(PartitionedContainerInterface pContainer)
{
    return mPapyrusFromContainer.get(pContainer);
}
}


179
2
задан 28 ноября 2011 в 02:11 Источник Поделиться
Комментарии
1 ответ

Во-первых, вы правы, что у вас там уроков не строитель, но больше похоже на фабрику класса. Что примерно эквивалентно статический метод фабрики.

Теперь, вопрос об использовании конструкторов против статических методов фабрики, над которой было много разговоров, и по большей части не убедительны, универсально-применимые ответы. (Просто поиск по "c# конструктор против статический метод фабрики", и вы увидите.) Тем не менее, конкретно для вашего случая, где как построен класс и код построения его собственной внутри другого класса, преимущества "обнаруживаемость" и "узнаваемость" что нового ключевого слова не применимы, так что я бы определенно пойти с фабричного метода или класса.

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

2
ответ дан 28 ноября 2011 в 07:11 Источник Поделиться