Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 制作比萨饼使用哪种设计模式_Design Patterns - Fatal编程技术网

Design patterns 制作比萨饼使用哪种设计模式

Design patterns 制作比萨饼使用哪种设计模式,design-patterns,Design Patterns,我想做一个小的应用程序,它会根据给定的输入返回一个比萨饼给我。 我想用不同的原料做一个中等大小的比萨饼 1.像白色面团或棕色面团2。不同类型的奶酪配料,比如白色或棕色奶酪3。洋葱、番茄或蘑菇的不同配料 那么,我们如何决定在这里选择哪种模式,建筑商还是装饰商? 我觉得我们可以先用建筑图案来做比萨饼,然后再用装饰图案,根据我们选择的不同配料来装饰比萨饼。我的理解正确吗? 据我所知,装饰图案用于装饰任何已经存在的对象。要创建此现有对象,我们将首先使用生成器模式。这里您不需要创建模式:您只有一种类型的对

我想做一个小的应用程序,它会根据给定的输入返回一个比萨饼给我。 我想用不同的原料做一个中等大小的比萨饼 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);