【问题标题】:Abstract Factory as a Strategy? [closed]抽象工厂作为一种策略? [关闭]
【发布时间】:2012-07-11 07:45:58
【问题描述】:

我想知道是否可以使用抽象工厂作为策略,例如嵌套这两种模式并将工厂类称为策略

我提供了一个例子来说明我的问题。 ShoppingMall 类将是上下文类,而 PizzaStore 将是有问题的抽象工厂,我认为在这种情况下也是一种策略。

// interface of context class, mostly a wrapper
// uses 3 different strategies
interface ShoppingMall
{
    PizzaStore GetPizzaStore();
    ParkingLot GetParkingLot();
    Adverts GetAdverts();

    void CustomerArrives();
}

// abstract factory & strategy interface?
interface PizzaStore 
{
    Pizza CreatePizzaCheese();
    Pizza CreatePizzaVeggie();
    Pizza CreatePizzaClam();
    Pizza CreatePizzaPepperoni();
}

// strategy interface
interface ParkingLot 
{
    void Pay();
}

// strategy interface   
interface Adverts
{
    void CreateSpam();
}

class PizzaStoreChicago implements PizzaStore {}
class PizzaStoreNY implements PizzaStore {}
class PizzaStoreObjectVille  implements PizzaStore {}

class ParkingLotBig   implements ParkingLot {}
class ParkingLotSmall implements ParkingLot {}
class ParkingLotCheap implements ParkingLot {}

class AdvertsAnnoying implements Adverts {}
class AdvertsBoring implements Adverts {}
class AdvertsStupid implements Adverts {}

class ShoppingMallObjectVille implements ShoppingMall {}
class ShoppingMallJavaRanch implements ShoppingMall {}
class ShoppingMallAverage implements ShoppingMall {}
class ShoppingMallOther implements ShoppingMall {}

【问题讨论】:

  • 如果它解决了你需要解决的问题,那就去吧。模式只是常见问题的常见解决方案的名称。您可以根据需要使用它们来解决问题。
  • 这与它是否解决了问题(确实如此)无关。我想知道在这种情况下,策略和抽象工厂模式的术语是否可以应用于同一个类。

标签: java oop design-patterns factory-pattern strategy-pattern


【解决方案1】:

是的,组合一个以上的设计模式来解决问题并没有什么坏处。从您的设计中,我可以看出以下问题:

接口PizzaStore 不应该包含所有这些创建方法,因为它没有真正意义(您正在强制所有比萨店实现所有这些方法,如果比萨店只生产素食比萨怎么办?)。策略模式表示您必须以多种不同的方式实现一种方法或抽象算法。这将使您能够灵活地在运行时切换算法和策略。

“PizzaStore”应该看起来像这样:

interface PizzaStore 
{
    Pizza CreatePizza();
}

所有PizzaStore 实现都应该实现一个CreatePizza 方法,该方法将返回一个Pizza,它应该是一个抽象类或接口。 Pizza 的实现/扩展应该是:PizzaCheesePizzaVeggiePizzaClamPizzaPepperoni

【讨论】:

  • 感谢您指出披萨问题,错过了。我从一个更复杂的设计中派生了这个例子,其中抽象工厂创建了不同类的相关对象。我选择披萨店是因为我喜欢 Head First: Design Patterns。应该使用doughsaucetoppings 来说明这一点。
  • 当然没问题。很高兴为您提供帮助
  • 抽象披萨类的好点:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
相关资源
最近更新 更多