抽象工厂作为战略?

时间:2012-07-11 07:45:58

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

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

我提供了一个例子来说明我的问题。类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 {}

1 个答案:

答案 0 :(得分:2)

是的,组合多个设计模式以解决问题是没有害处的。从您的设计中,我可以看到以下问题:

界面PizzaStore不应该包含所有那些创造性的方法,因为它没有意义(你强迫所有披萨店实施所有这些方法,如果披萨商店只制作素食披萨怎么办?)。策略模式表明您必须以多种不同方式实现一种方法或抽象算法。这将使您可以灵活地在运行时切换算法和策略。

'PizzaStore'应该是这样的:

interface PizzaStore 
{
    Pizza CreatePizza();
}

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