Design patterns 制作比萨饼使用哪种设计模式
我想做一个小的应用程序,它会根据给定的输入返回一个比萨饼给我。 我想用不同的原料做一个中等大小的比萨饼 1.像白色面团或棕色面团2。不同类型的奶酪配料,比如白色或棕色奶酪3。洋葱、番茄或蘑菇的不同配料 那么,我们如何决定在这里选择哪种模式,建筑商还是装饰商? 我觉得我们可以先用建筑图案来做比萨饼,然后再用装饰图案,根据我们选择的不同配料来装饰比萨饼。我的理解正确吗?Design patterns 制作比萨饼使用哪种设计模式,design-patterns,Design Patterns,我想做一个小的应用程序,它会根据给定的输入返回一个比萨饼给我。 我想用不同的原料做一个中等大小的比萨饼 1.像白色面团或棕色面团2。不同类型的奶酪配料,比如白色或棕色奶酪3。洋葱、番茄或蘑菇的不同配料 那么,我们如何决定在这里选择哪种模式,建筑商还是装饰商? 我觉得我们可以先用建筑图案来做比萨饼,然后再用装饰图案,根据我们选择的不同配料来装饰比萨饼。我的理解正确吗? 据我所知,装饰图案用于装饰任何已经存在的对象。要创建此现有对象,我们将首先使用生成器模式。这里您不需要创建模式:您只有一种类型的对
据我所知,装饰图案用于装饰任何已经存在的对象。要创建此现有对象,我们将首先使用生成器模式。这里您不需要创建模式:您只有一种类型的对象:Pizza。因此,Factory和Builder模式都不行 根据维基百科: 装饰器模式允许用户将新功能添加到 不改变其结构的现有对象。这种类型的设计 模式属于结构模式,因为此模式充当 现有类的包装器
装饰图案显然是您所需要的 所有示例都是用Java编写的 TLTR:向下滚动到生成器模式 装饰图案(在这种情况下不要使用) 例如,如果您有一个表示矩形的类,则可以使用decorator模式。矩形类只有一个计算周长的方法。现在,您需要向矩形添加一个方法来计算面积。问题是,您不能也不想编辑类矩形,因此创建一个新类MySuperDuperRectangle,如下所示: 周界界面:
interface Perimeter{
public int perimeter();
}
由于某种原因我们不能改变的矩形
class Rectange implements perimeter{
private int a, b;
public Rectange(int a, int b){
this.a = a;
this.b = b;
}
public int getA(){
return a;
}
public int getB(){
return b;
}
public int perimeter(){
return 2 * a + 2 * b;
}
}
装饰矩形:
class MySuperDuperRectange implements perimeter{
private Rectange r;
public MySuperDuperRectange(Rectange r){
this.r = r;
}
public int perimeter(){
return r.perimeter();
}
public float area(){
return r.getA() * r.getB();
}
}
生成器模式(在本例中我将使用它)
我会选择Builder模式,因为任务是building
a pizza
构建器模式用于构建后记按原样存在(并且在任何时候都不应更改)的内容
PizzaBuiler的基本实现如下所示:
package com.builder.pattern;
面团枚举:
enum Dough{
WHITE, BROWN
}
奶酪枚举:
enum Cheese{
WHITE, BROWN
}
浇头枚举:
enum Topping{
Kittens, Onions, Salami
}
尤米比萨饼:
class Pizza{
private Dough dough;
private Cheese cheese;
private HashSet<Topping> toppings;
private Pizza(Dough dough, Cheese cheese, HashSet<Topping> toppings){
this.dough = dough;
this.cheese = cheese;
this.toppings = toppings;
}
//add some getters
}
正如您所看到的,创建一个新的比萨饼是非常困难的,不需要为地球上所有可能的比萨饼编写一个新类;)
参考实现:在构建比萨饼对象时,您可以继续使用生成器图案、传递面团、您选择的浇头,这里不需要装饰图案: 构建器模式的示例,如下所示:
package com.builder.pattern;
公共级比萨饼{
boolean isCheesy;
boolean isTomato;
boolean isMaxican;
public Pizza(PizzaBuilder pizzaBuilder) {
this.isCheesy = pizzaBuilder.isCheesy;
this.isTomato = pizzaBuilder.isTomato;
this.isMaxican = pizzaBuilder.isMaxican;
}
static class PizzaBuilder {
boolean isCheesy;
boolean isTomato;
boolean isMaxican;
public Pizza build() {
return new Pizza(this);
}
public PizzaBuilder setCheese(boolean isCheesy) {
this.isCheesy = isCheesy;
return this;
}
public PizzaBuilder setTomato(boolean isTomato) {
this.isTomato = isTomato;
return this;
}
public PizzaBuilder setMaxican(boolean isMaxican) {
this.isMaxican = isMaxican;
return this;
}
}
@Override
public String toString() {
return "Pizza [isCheesy=" + isCheesy + ", isTomato=" + isTomato + ", isMaxican=" + isMaxican + "]";
}
}
准备比萨饼如下:
Pizza pizza = new Pizza.PizzaBuilder().setCheese(false).setTomato(true).setMaxican(true).build();
System.out.println(pizza);
还是像这样
Pizza pizza = new Pizza.PizzaBuilder().setMaxican(true).build();
System.out.println(pizza);
设计模式是解决编程语言缺陷的方法,那么您使用哪种语言?用户是厨师还是客户?您还需要一种高效的设计模式来解决它:(SCNR)我使用Java,我是这里的客户。我觉得可以使用建筑图案,因为配料可以根据比萨饼的类型而改变。装饰图案增加了功能这是真的,但比萨饼的工作原理是一样的,要么是洋葱,要么是没有,不需要额外的功能。我不同意。“配料”就是“功能性”。我非常感兴趣的是如何用比萨饼的例子来实现这一点。你能通过添加一个java示例来更新你的答案吗。。。“每次向重写的方法添加新功能…”在我的理解中,wiki文章范围内的功能意味着“方法”!我会同意使用decorator。实际上,您可以将这些setX抽象为setcomponent()。基本上,你可以用不限数量的配料来装饰“比萨饼”,并且永远不要修改任何涉及比萨饼代码的东西。
Pizza pizza = new Pizza.PizzaBuilder().setMaxican(true).build();
System.out.println(pizza);