2014-02-11 3 views
3

Я читал об абстрактном заводском тесте на wiki. Но я не понимаю действительно прибыль, используя этот шаблон. Можете ли вы привести пример, в котором трудно избежать абстрактного шаблона фабрики. Рассмотрим следующий Java-код:Понимание Аннотация Заводской шаблон

public abstract class FinancialToolsFactory { 
    public abstract TaxProcessor createTaxProcessor(); 
    public abstract ShipFeeProcessor createShipFeeProcessor(); 
} 

public abstract class ShipFeeProcessor { 
    abstract void calculateShipFee(Order order); 
} 

public abstract class TaxProcessor { 
    abstract void calculateTaxes(Order order); 
} 

// Factories 
public class CanadaFinancialToolsFactory extends FinancialToolsFactory { 
    public TaxProcessor createTaxProcessor() { 
     return new CanadaTaxProcessor(); 
    } 
    public ShipFeeProcessor createShipFeeProcessor() { 
     return new CanadaShipFeeProcessor(); 
    } 
} 

public class EuropeFinancialToolsFactory extends FinancialToolsFactory { 
    public TaxProcessor createTaxProcessor() { 
     return new EuropeTaxProcessor(); 
    } 
    public ShipFeeProcessor createShipFeeProcessor() { 
     return new EuropeShipFeeProcessor(); 
    } 
} 

// Products 
public class EuropeShipFeeProcessor extends ShipFeeProcessor { 
    public void calculateShipFee(Order order) { 
     // insert here Europe specific ship fee calculation 
    } 
} 

public class CanadaShipFeeProcessor extends ShipFeeProcessor { 
    public void calculateShipFee(Order order) { 
     // insert here Canada specific ship fee calculation 
    } 
} 

public class EuropeTaxProcessor extends TaxProcessor { 
    public void calculateTaxes(Order order) { 
     // insert here Europe specific tax calculation 
    } 
} 

public class CanadaTaxProcessor extends TaxProcessor { 
    public void calculateTaxes(Order order) { 
     // insert here Canada specific tax calculation 
    } 
} 

Если нам нужно просто создать объекты в коде ниже 1-2 раза в коде, тогда мы можем использовать только новый оператор. И почему нам нужно в абстрактной фабрике?

ответ

2

Вы не хватает половины работы :)

void processOrder(FinancialToolsFactory ftf,Order o) { 

    tft.createTaxProcessor().calculateTaxes(o); 
    tft.createShipFeeProcessor().calculateShipFee(o); 
} 

этот код работает так же, как вы проходите канадскую или европейскую реализацию FinancialToolsFactory (вы можете экстернализовать класс реализатор на внешний ресурс и экземпляр с классом .newInstance(), например).

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

PS: Мой ответ намеренно неполный и пытается ответить только на этот конкретный вопрос; дискуссия о шаблоне и их преимуществах слишком велика!

3

Вы бы воспользовались этим шаблоном, если бы вы прозрачно поддерживали различные реализации. Делегируя решение о том, какая реализация должна использоваться на заводе, у вас есть одна точка в коде, где это решение принято (a.k.a.).

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

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

2

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

Но я считаю, что ключевым моментом является:

С помощью этой модели, кто-то, кто хочет создать экземпляр конкретной реализации интерфейса не нужно знать, что это конкретная реализация является. Вызов оператора new скрыт на заводе, и пользователю завода не нужно знать конкретный класс.

Это облегчает переход к реализации позже: вам не нужно находить и настраивать все места, где был вызван new ConcreteClass(), и изменить его на new OtherConcreteClass(), чтобы использовать другую реализацию. Вы просто проходите другую фабрику, и все, кто использует эту фабрику, автоматически создают экземпляры OtherConcreteClass (даже не зная, что он это делает ...)

Смежные вопросы