我想知道是否可以使用抽象工厂作为策略,例如嵌套这两种模式,也将工厂类称为策略。
我提供了一个例子来说明我的问题。类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 {}
答案 0 :(得分:2)
是的,组合多个设计模式以解决问题是没有害处的。从您的设计中,我可以看到以下问题:
界面PizzaStore
不应该包含所有那些创造性的方法,因为它没有意义(你强迫所有披萨店实施所有这些方法,如果披萨商店只制作素食披萨怎么办?)。策略模式表明您必须以多种不同方式实现一种方法或抽象算法。这将使您可以灵活地在运行时切换算法和策略。
'PizzaStore'应该是这样的:
interface PizzaStore
{
Pizza CreatePizza();
}
然后,所有PizzaStore
实现都应该实现一个CreatePizza
方法,该方法将返回一个Pizza
,它应该是一个抽象类或接口。 Pizza
的实施/扩展应该是:PizzaCheese
,PizzaVeggie
,PizzaClam
,PizzaPepperoni