忙是单向,可是说忙能有多忙啊

开篇

开篇

整日逛知乎,正是狠不下心来写篇博客,忙是一派,不过说忙能有多忙啊,都有时间逛新浪,写篇博客的时日都不曾?(那还真倒霉说)

每一日逛搜狐,就是狠不下心来写篇博客,忙是单向,可是说忙能有多忙呢,都有时间逛微博,写篇博客的小时都没有?(这还真不好说)

每一趟想到写一篇新的设计格局,笔者总会问自个儿:

每一趟想到写一篇新的设计形式,我总会问本人:

1,本人掌握了吧?

1,本人理解了啊?

2,我能以一种简单且有逻辑的主意把它说出去啊?

2,笔者能以一种不难且有逻辑的艺术把它说出去啊?

背着做到有的放矢,不过一本正经的放屁依旧要有啊,起码要忽悠得一板三眼嘛(手动斜眼笑)

不说做到万无一失,不过一本正经的胡扯依旧要有吗,起码要忽悠得一板三眼嘛(手动斜眼笑)

有关工厂格局的多少个难题

关于工厂格局的几个难题

1,这几个是拿来干什么的?

1,那一个是拿来干什么的?

2,怎么用?

2,怎么用?

3,不用好依旧不佳?

3,不用好不好?

首先个和第几个难点,作者先天就足以告知您答案:早点下班,能够

率先个和第四个难点,小编现在就能够告诉你答案:早点收工,能够

拥有的设计方式对自家来说都以为了削减工作量。关于收缩工作量小编的接头是:每种供给,都应该在它适合的时候出现适当的代码!这几个太首要了

怀有的设计格局对自己来说都以为了缩小工作量。关于缩小工作量作者的精晓是:每种必要,都应有在它适合的时候出现适当的代码!这些太首要了

代码偷懒,前期返工多

代码偷懒,前期返工多

超负荷设计,前期返工多

过度设计,早先时期返工多

设计形式+经验能够消除那几个题材,别的的自我还不知晓。没有经验怎么办?四个要点:

设计方式+经验能够消除那几个题材,其余的本身还不了然。没有经验咋做?七个要点:

1,能用

1,能用

2,简洁

2,简洁

率先要落成能用,然后就是尽量简洁,那样代码就不会太差。首先你要本人看得懂,然后是让队友看得懂。

先是要高达能用,然后正是尽量简洁,那样代码就不会太差。首先你要协调看得懂,然后是让队友看得懂。

您知道您队友看到一堆烂的看都看不懂,也一句注释都并未的代码的时候的思维阴影面积吗?

您驾驭您队友看到一堆烂的看都看不懂,也一句注释都没有的代码的时候的思维阴影面积吗?

那实际上也没怎么,哪个人没填过旁人的坑呢?关键是他掌握你家在何地,而且还知道你时常走夜路,就问您怕不怕?(卧槽,又跑题了。。)

那实质上也没怎么,何人没填过外人的坑呢?关键是她理解你家在哪里,而且还通晓您时常走夜路,就问你怕不怕?(卧槽,又跑题了。。)

 

 

须求:你有一个披萨店,只卖一种披萨,代码如下:

必要:你有贰个披萨店,只卖一种披萨,代码如下:

披萨:

披萨:

import java.util.ArrayList;
import java.util.List;

/**
 * 披萨类
 * @author skysea
 */
public class Pizza {

    private String name;//披萨名称

    private String dough;//面团

    private String sauce;//酱料

    private List<String> toppings = new ArrayList<>();//佐料

    public Pizza() {
            this.name = "原味披萨";
            this.dough = "原味面团";
            this.sauce = "原味酱料";
    }

    void prepare() {
        System.out.println("开始准备披萨:" + name);

        System.out.println("开始处理面团:" + dough);

        System.out.println("添加酱料:" + sauce);

        System.out.println("添加佐料:");
        if(toppings.size() > 0) {
            for(String t : toppings) {
                System.out.println(" " + t);
            }
        }
    }

    void bake() {
        System.out.println("烘焙25分钟..");
    }

    void cut() {
        System.out.println("披萨切片..");
    }

    void box() {
        System.out.println("披萨打包..");
    }

    public String getName() {
        return name;
    }
}
import java.util.ArrayList;
import java.util.List;

/**
 * 披萨类
 * @author skysea
 */
public class Pizza {

    private String name;//披萨名称

    private String dough;//面团

    private String sauce;//酱料

    private List<String> toppings = new ArrayList<>();//佐料

    public Pizza() {
            this.name = "原味披萨";
            this.dough = "原味面团";
            this.sauce = "原味酱料";
    }

    void prepare() {
        System.out.println("开始准备披萨:" + name);

        System.out.println("开始处理面团:" + dough);

        System.out.println("添加酱料:" + sauce);

        System.out.println("添加佐料:");
        if(toppings.size() > 0) {
            for(String t : toppings) {
                System.out.println(" " + t);
            }
        }
    }

    void bake() {
        System.out.println("烘焙25分钟..");
    }

    void cut() {
        System.out.println("披萨切片..");
    }

    void box() {
        System.out.println("披萨打包..");
    }

    public String getName() {
        return name;
    }
}

 

 

披萨店:

披萨店:

/**
 * 只卖一种披萨的披萨店
 * @author skysea
 */
public class PizzaStore {

    public Pizza orderPizza() {
        Pizza pizza = new Pizza();
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}
/**
 * 只卖一种披萨的披萨店
 * @author skysea
 */
public class PizzaStore {

    public Pizza orderPizza() {
        Pizza pizza = new Pizza();
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}

 测试类:

 测试类:

/**
 * pizza测试类
 * @author skysea
 */
public class PizzaTest {
    public static void main(String[] args) {
        PizzaStore pizzaStore = new PizzaStore();
        Pizza pizza = pizzaStore.orderPizza();
        System.out.println("当前预定的披萨:" + pizza.getName());
    }
}
/**
 * pizza测试类
 * @author skysea
 */
public class PizzaTest {
    public static void main(String[] args) {
        PizzaStore pizzaStore = new PizzaStore();
        Pizza pizza = pizzaStore.orderPizza();
        System.out.println("当前预定的披萨:" + pizza.getName());
    }
}

betvictor1946 1 

betvictor1946 2 

明日披萨店要进行业务了,因为卖一种披萨顾客曾经吃腻了,未来要从头添加新的披萨类型

当今披萨店要实行工作了,因为卖一种披萨顾客曾经吃腻了,今后要起来添加新的披萨类型

回顾工厂情势

大致工厂形式

Pizza类的寻行数墨

Pizza类的改进

import java.util.ArrayList;
import java.util.List;

/**
 * 披萨抽象类
 * 1,修改private -> protected(保证子类拥有这些属性)
 * 2,将Pizza定义为abstract类,防止被new,也是为后面的改造做准备
 * @author skysea
 */
public abstract class Pizza {

    protected String name;//披萨名称

    protected String dough;//面团

    protected String sauce;//酱料

    protected List<String> toppings = new ArrayList<>();//佐料

    void prepare() {
        System.out.println("开始准备披萨:" + name);

        System.out.print("开始处理面团:" + dough);

        System.out.println("添加酱料:" + sauce);

        System.out.println("添加佐料:");
        for(String t : toppings) {
            System.out.println(" " + t);
        }
    }

    void bake() {
        System.out.println("烘焙25分钟..");
    }

    void cut() {
        System.out.println("披萨切片..");
    }

    void box() {
        System.out.println("披萨打包..");
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Pizza [name=" + name + ", dough=" + dough + ", sauce=" + sauce + ", toppings=" + toppings + "]";
    }
}
import java.util.ArrayList;
import java.util.List;

/**
 * 披萨抽象类
 * 1,修改private -> protected(保证子类拥有这些属性)
 * 2,将Pizza定义为abstract类,防止被new,也是为后面的改造做准备
 * @author skysea
 */
public abstract class Pizza {

    protected String name;//披萨名称

    protected String dough;//面团

    protected String sauce;//酱料

    protected List<String> toppings = new ArrayList<>();//佐料

    void prepare() {
        System.out.println("开始准备披萨:" + name);

        System.out.print("开始处理面团:" + dough);

        System.out.println("添加酱料:" + sauce);

        System.out.println("添加佐料:");
        for(String t : toppings) {
            System.out.println(" " + t);
        }
    }

    void bake() {
        System.out.println("烘焙25分钟..");
    }

    void cut() {
        System.out.println("披萨切片..");
    }

    void box() {
        System.out.println("披萨打包..");
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Pizza [name=" + name + ", dough=" + dough + ", sauce=" + sauce + ", toppings=" + toppings + "]";
    }
}

先提交新增的披萨

先交给新增的披萨

芝士披萨:

芝士披萨:

betvictor1946 3betvictor1946 4

betvictor1946 5betvictor1946 6

/**
 * 芝士披萨
 * @author skysea
 */
public class CheesePizza extends Pizza{
    public CheesePizza() {
        this.name = "芝士披萨";
        this.dough = "芝士披萨的面团";
        this.sauce = "芝士披萨的酱料";
        this.toppings.add("很多芝士....");
    }
}
/**
 * 芝士披萨
 * @author skysea
 */
public class CheesePizza extends Pizza{
    public CheesePizza() {
        this.name = "芝士披萨";
        this.dough = "芝士披萨的面团";
        this.sauce = "芝士披萨的酱料";
        this.toppings.add("很多芝士....");
    }
}

View Code

View Code

蛤蜊披萨:

蛤蜊披萨:

betvictor1946 7betvictor1946 8

betvictor1946 9betvictor1946 10

/**
 * 蛤蜊披萨
 * @author skysea
 */
public class ClamPizza extends Pizza {
    public ClamPizza() {
        this.name = "蛤蜊披萨";
        this.dough = "蛤蜊披萨的面团";
        this.sauce = "蛤蜊披萨的酱料";
        this.toppings.add("蛤蜊");
    }
}
/**
 * 蛤蜊披萨
 * @author skysea
 */
public class ClamPizza extends Pizza {
    public ClamPizza() {
        this.name = "蛤蜊披萨";
        this.dough = "蛤蜊披萨的面团";
        this.sauce = "蛤蜊披萨的酱料";
        this.toppings.add("蛤蜊");
    }
}

View Code

View Code

意国烤肠披萨:

意国烤肠披萨:

betvictor1946 11betvictor1946 12

betvictor1946 13betvictor1946 14

/**
 * 意大利烤肠披萨
 * @author skysea
 */
public class PepperoniPizza extends Pizza{

    public PepperoniPizza() {
        this.name = "意大利烤肠披萨";
        this.dough = "意大利烤肠披萨的面团";
        this.sauce = "意大利烤肠披萨的酱料";
        this.toppings.add("一大波意大利烤肠...");
    }
}
/**
 * 意大利烤肠披萨
 * @author skysea
 */
public class PepperoniPizza extends Pizza{

    public PepperoniPizza() {
        this.name = "意大利烤肠披萨";
        this.dough = "意大利烤肠披萨的面团";
        this.sauce = "意大利烤肠披萨的酱料";
        this.toppings.add("一大波意大利烤肠...");
    }
}

View Code

View Code

 素食比萨:

 素食比萨:

betvictor1946 15betvictor1946 16

betvictor1946 17betvictor1946 18

/**
 * 素食比萨
 * @author skysea
 */
public class VeggiePizza extends Pizza {
    public VeggiePizza() {
        name = "素食比萨";
        dough = "素食比萨的面团";
        sauce = "素食比萨的酱料";
        toppings.add("素食比萨");
        toppings.add("素食比萨佐料1");
        toppings.add("素食比萨佐料2");
    }
}
/**
 * 素食比萨
 * @author skysea
 */
public class VeggiePizza extends Pizza {
    public VeggiePizza() {
        name = "素食比萨";
        dough = "素食比萨的面团";
        sauce = "素食比萨的酱料";
        toppings.add("素食比萨");
        toppings.add("素食比萨佐料1");
        toppings.add("素食比萨佐料2");
    }
}

View Code

View Code

贴了这么多代码,先提交一波简单的贯彻:

贴了那样多代码,先付给一波不难的兑现:

/**
 * pizza店
 * @author skysea
 */
public class PizzaStore {

    public Pizza orderPizza(String type) {
        Pizza pizza = null;
        if (type.equals("cheese")) {
            pizza = new CheesePizza();
        } else if (type.equals("pepperoni")) {
            pizza = new PepperoniPizza();
        } else if (type.equals("clam")) {
            pizza = new ClamPizza();
        } else if (type.equals("veggie")) {
            pizza = new VeggiePizza();
        }

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }

}
/**
 * pizza店
 * @author skysea
 */
public class PizzaStore {

    public Pizza orderPizza(String type) {
        Pizza pizza = null;
        if (type.equals("cheese")) {
            pizza = new CheesePizza();
        } else if (type.equals("pepperoni")) {
            pizza = new PepperoniPizza();
        } else if (type.equals("clam")) {
            pizza = new ClamPizza();
        } else if (type.equals("veggie")) {
            pizza = new VeggiePizza();
        }

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }

}

在不考虑继续壮大披萨体系的时候,那样的兑现有没有标题,一般的话,达到了能够用的正经,可是倒霉用,难题如下:

在不考虑继续扩充披萨类别的时候,那样的兑现有没有标题,一般的话,达到了足以用的正式,可是倒霉用,难题如下:

1,没有包容原来的一种披萨方法 public Pizza
orderPizza(),相信作者,每三个public方法都是很要紧的,因为你不亮堂有稍许地点用到过。当然也不是不可能知道,只是你精晓也不必然就能改,就算你能改,也不自然改对。

1,没有包容原来的一种披萨方法 public Pizza
orderPizza(),相信笔者,每2个public方法都以很重庆大学的,因为你不知底有稍许地方用到过。当然也不是不可能知道,只是你明白也不必然就能改,即便你能改,也不自然改对。

2,String类型的type太不难出错了,个人感觉对程序支付不协调,当然这些也要分境况,灵活和不敢越雷池一步本来就很难达成两全

2,String类型的type太不难失误了,个人感觉对先后开发不协调,当然那些也要分情况,灵活和审慎本来就很难做到两全

3,推荐取不到适当的type时抛格外,而不是再次回到空,便于排查难点(此处的if里面只是平素new重返的对象,实情远比今日的繁杂)

3,推荐取不到适当的type时抛格外,而不是回来空,便于排查难点(此处的if里面只是一贯new重临的对象,真实景况远比后天的扑朔迷离)

交付第②版:

交给第②版:

/**
 * pizza店
 * @author skysea
 */
public class PizzaStore {

    public Pizza orderPizza() {
        return orderPizza(PizzaTypeEnum.CHEESE);
    }

    public Pizza orderPizza(PizzaTypeEnum type) {
        Pizza pizza;

        pizza = SimplePizzaFactory.getPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }
}
/**
 * pizza店
 * @author skysea
 */
public class PizzaStore {

    public Pizza orderPizza() {
        return orderPizza(PizzaTypeEnum.CHEESE);
    }

    public Pizza orderPizza(PizzaTypeEnum type) {
        Pizza pizza;

        pizza = SimplePizzaFactory.getPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }
}

SimplePizzaFactory:

SimplePizzaFactory:

/**
 * 简单工厂类
 * @author skysea
 */
public class SimplePizzaFactory {

    /**
     * 根据类型获取pizza
     * @param type
     * @return
     */
    public static final Pizza getPizza(PizzaTypeEnum type){
        switch (type) {
            case CHEESE: return new CheesePizza();
            case CLAM: return new ClamPizza();
            case PEPPERONI: return new PepperoniPizza();
            case VEGGIE: return new VeggiePizza();
            default: throw new NoSuchPizzaException(type.getCode());
        }
    }
}
/**
 * 简单工厂类
 * @author skysea
 */
public class SimplePizzaFactory {

    /**
     * 根据类型获取pizza
     * @param type
     * @return
     */
    public static final Pizza getPizza(PizzaTypeEnum type){
        switch (type) {
            case CHEESE: return new CheesePizza();
            case CLAM: return new ClamPizza();
            case PEPPERONI: return new PepperoniPizza();
            case VEGGIE: return new VeggiePizza();
            default: throw new NoSuchPizzaException(type.getCode());
        }
    }
}

辅助类(枚举,异常):

辅助类(枚举,异常):

betvictor1946 19betvictor1946 20

betvictor1946 21betvictor1946 22

/**
 * 定义pizza类型枚举
 * @author skysea
 *
 */
public enum PizzaTypeEnum{
    /**
     * 芝士披萨
     */
    CHEESE("cheese"),
    /**
     * 意大利烤肠披萨
     */
    PEPPERONI("pepperoni"),
    /**
     * 蛤蜊披萨
     */
    CLAM("clam"),
    /**
     * 素食比萨
     */
    VEGGIE("veggie");
    private final String code;
    PizzaTypeEnum(String code) {
        this.code = code;
    }
    public String getCode() {
        return code;
    }
}
/**
 * 定义pizza类型枚举
 * @author skysea
 *
 */
public enum PizzaTypeEnum{
    /**
     * 芝士披萨
     */
    CHEESE("cheese"),
    /**
     * 意大利烤肠披萨
     */
    PEPPERONI("pepperoni"),
    /**
     * 蛤蜊披萨
     */
    CLAM("clam"),
    /**
     * 素食比萨
     */
    VEGGIE("veggie");
    private final String code;
    PizzaTypeEnum(String code) {
        this.code = code;
    }
    public String getCode() {
        return code;
    }
}

View Code

View Code

betvictor1946 23betvictor1946 24

betvictor1946 25betvictor1946 26

/**
 * 没有匹配的pizza异常
 * @author skysea
 */
public class NoSuchPizzaException extends RuntimeException{
    private static final long serialVersionUID = 6831396172306375611L;
    public NoSuchPizzaException(String message) {
        super(message);
    }
}
/**
 * 没有匹配的pizza异常
 * @author skysea
 */
public class NoSuchPizzaException extends RuntimeException{
    private static final long serialVersionUID = 6831396172306375611L;
    public NoSuchPizzaException(String message) {
        super(message);
    }
}

View Code

View Code

测试类:

测试类:

/**
 * pizza测试类
 * @author skysea
 */
public class PizzaTest {

    public static void main(String[] args) {
        PizzaStore store = new PizzaStore();

        Pizza pizza = store.orderPizza(PizzaTypeEnum.CHEESE);
        System.out.println(pizza);

        pizza = store.orderPizza(PizzaTypeEnum.VEGGIE);
        System.out.println(pizza);
    }
}
/**
 * pizza测试类
 * @author skysea
 */
public class PizzaTest {

    public static void main(String[] args) {
        PizzaStore store = new PizzaStore();

        Pizza pizza = store.orderPizza(PizzaTypeEnum.CHEESE);
        System.out.println(pizza);

        pizza = store.orderPizza(PizzaTypeEnum.VEGGIE);
        System.out.println(pizza);
    }
}

betvictor1946 27

betvictor1946 28

好了,代码写到那里,其实对于:新增披萨类型的那些必要的完成其实早已很好了。至少来说现阶段的供给完成了,其次正是对调用方友好,至少队友不会跑过来问您类型传啥,不会告知您他string字符串传错了,不会在你改个体系的时候,还要通告他(当然这一个也得以透过常量来拍卖)。

好了,代码写到那里,其实对于:新增披萨类型的这几个必要的贯彻其实已经很好了。至少来说现阶段的急需完毕了,其次正是对调用方友好,至少队友不会跑过来问您类型传啥,不会告诉您他string字符串传错了,不会在你改个档次的时候,还要通告她(当然这些也得以经过常量来处理)。

吹了半天,来说说那段代码的题材,经常情况下,须要会是那般变:

吹了半天,来说说那段代码的标题,平常状态下,须要会是那般变:

1,PepperoniPizza一时不要了,一般的话,你问她要不要,他会说,那个要看前面的运转状态(作者:…)

betvictor1946,1,PepperoniPizza暂时不要了,一般的话,你问她要不要,他会说,那些要看后边的营业情况(作者:…)

2,你给本人新加多少个xx披萨

2,你给自个儿新加一个xx披萨

如今亟待改的是多少个地点,三个是工厂类,贰个是枚举,不过最首要的流程是绝不改了,若是你以为依然很麻烦在不考虑质量的情事下,你还足以用反射来玩,改造一下工厂类(达成通过class来创制对象)和枚举(添加三个字段来存放在type对应的class)就能够了,不赘述..

未来急需改的是七个地方,3个是工厂类,四个是枚举,可是根本的流程是并非改了,即便你认为依旧很麻烦在不考虑质量的情事下,你还足以用反射来玩,改造一下工厂类(完结通过class来创设对象)和枚举(添加1个字段来存放type对应的class)就能够了,不赘述..

首先波供给就基本上能够如此收手了,随着事情的开拓进取,披萨店那叫2个方便啊,即使中间也对代码做了好多新的披萨,不过出于PizzaStore卓殊稳定,也没出什么大难题。

率先波要求就基本上可以这么收手了,随着事情的升华,披萨店那叫三个富贵啊,纵然中间也对代码做了过多新的披萨,但是由于PizzaStore11分稳定,也没出什么大难题。

新的难题(开分店):

新的标题(开分店):

1,旗舰店在伊Stan布尔,以后要在London开一家新的店

1,旗舰店在蔚山,现在要在伦敦开一家新的店

2,分店的披萨口味要基于本地的气味来拓展调整,保障能够不失品牌特色的同时,也能满足当地特有的气韵

2,分店的披萨口味要基于地面包车型大巴意气来开始展览调整,保险能够不失品牌特色的同时,也能满意当地万分的韵味

3,分店披萨的类型与一时与旗舰店保持一致

3,分店披萨的花色与暂时与旗舰店保持一致

工厂方法格局

工厂方法形式

先把具有的披萨列出来

先把具备的披萨列出来

吉隆坡的披萨:

孟买的披萨:

betvictor1946 29betvictor1946 30

betvictor1946 31betvictor1946 32

/**
 * 芝加哥芝士披萨
 * @author skysea
 */
public class ChicagoStyleCheesePizza extends Pizza {

    public ChicagoStyleCheesePizza() { 
        name = "芝加哥芝士披萨";
        dough = "芝加哥芝士披萨面团";
        sauce = "芝加哥芝士披萨酱料";

        toppings.add("芝加哥芝士披萨调料1");
        toppings.add("芝加哥芝士披萨调料2");
    }

    @Override
    void cut() {
        System.out.println("芝加哥芝士披萨版切片...");
    }
}
/**
 * 芝加哥蛤蜊披萨
 * @author skysea
 */
public class ChicagoStyleClamPizza extends Pizza {
    public ChicagoStyleClamPizza() {
        name = "芝加哥蛤蜊披萨";
        dough = "芝加哥蛤蜊披萨面团";
        sauce = "芝加哥蛤蜊披萨酱料";

        toppings.add("芝加哥蛤蜊披萨佐料1");
        toppings.add("芝加哥蛤蜊披萨佐料2");
    }

    @Override
    void cut() {
        System.out.println("芝加哥蛤蜊披萨版切片...");
    }
}
/**
 * 芝加哥意大利烤肠披萨
 * @author skysea
 */
public class ChicagoStylePepperoniPizza extends Pizza {
    public ChicagoStylePepperoniPizza() {
        name = "芝加哥意大利烤肠披萨";
        dough = "芝加哥意大利烤肠披萨面团";
        sauce = "芝加哥意大利烤肠披萨酱料";

        toppings.add("芝加哥意大利烤肠披萨调料1");
        toppings.add("芝加哥意大利烤肠披萨调料2");
        toppings.add("芝加哥意大利烤肠披萨调料3");
        toppings.add("芝加哥意大利烤肠披萨调料4");
    }

    @Override
    void cut() {
        System.out.println("芝加哥意大利烤肠披萨版切片...");
    }
}
/**
 * 芝加哥素食比萨
 * @author skysea
 */
public class ChicagoStyleVeggiePizza extends Pizza {
    public ChicagoStyleVeggiePizza() {
        name = "芝加哥素食比萨";
        dough = "芝加哥素食比萨的面团";
        sauce = "芝加哥素食比萨的酱料";

        toppings.add("芝加哥素食比萨调料1");
        toppings.add("芝加哥素食比萨调料2");
        toppings.add("芝加哥素食比萨调料3");
    }

    void cut() {
        System.out.println("芝加哥素食比萨版切片...");
    }
}
/**
 * 芝加哥芝士披萨
 * @author skysea
 */
public class ChicagoStyleCheesePizza extends Pizza {

    public ChicagoStyleCheesePizza() { 
        name = "芝加哥芝士披萨";
        dough = "芝加哥芝士披萨面团";
        sauce = "芝加哥芝士披萨酱料";

        toppings.add("芝加哥芝士披萨调料1");
        toppings.add("芝加哥芝士披萨调料2");
    }

    @Override
    void cut() {
        System.out.println("芝加哥芝士披萨版切片...");
    }
}
/**
 * 芝加哥蛤蜊披萨
 * @author skysea
 */
public class ChicagoStyleClamPizza extends Pizza {
    public ChicagoStyleClamPizza() {
        name = "芝加哥蛤蜊披萨";
        dough = "芝加哥蛤蜊披萨面团";
        sauce = "芝加哥蛤蜊披萨酱料";

        toppings.add("芝加哥蛤蜊披萨佐料1");
        toppings.add("芝加哥蛤蜊披萨佐料2");
    }

    @Override
    void cut() {
        System.out.println("芝加哥蛤蜊披萨版切片...");
    }
}
/**
 * 芝加哥意大利烤肠披萨
 * @author skysea
 */
public class ChicagoStylePepperoniPizza extends Pizza {
    public ChicagoStylePepperoniPizza() {
        name = "芝加哥意大利烤肠披萨";
        dough = "芝加哥意大利烤肠披萨面团";
        sauce = "芝加哥意大利烤肠披萨酱料";

        toppings.add("芝加哥意大利烤肠披萨调料1");
        toppings.add("芝加哥意大利烤肠披萨调料2");
        toppings.add("芝加哥意大利烤肠披萨调料3");
        toppings.add("芝加哥意大利烤肠披萨调料4");
    }

    @Override
    void cut() {
        System.out.println("芝加哥意大利烤肠披萨版切片...");
    }
}
/**
 * 芝加哥素食比萨
 * @author skysea
 */
public class ChicagoStyleVeggiePizza extends Pizza {
    public ChicagoStyleVeggiePizza() {
        name = "芝加哥素食比萨";
        dough = "芝加哥素食比萨的面团";
        sauce = "芝加哥素食比萨的酱料";

        toppings.add("芝加哥素食比萨调料1");
        toppings.add("芝加哥素食比萨调料2");
        toppings.add("芝加哥素食比萨调料3");
    }

    void cut() {
        System.out.println("芝加哥素食比萨版切片...");
    }
}

View Code

View Code

London的披萨:

London的披萨:

betvictor1946 33betvictor1946 34

betvictor1946 35betvictor1946 36

/**
 * 纽约芝士披萨
 * @author skysea
 */
public class NYStyleCheesePizza extends Pizza {

    public NYStyleCheesePizza() { 
        name = "纽约芝士披萨";
        dough = "纽约芝士披萨面团";
        sauce = "纽约芝士披萨酱料";

        toppings.add("纽约芝士披萨调料1");
        toppings.add("纽约芝士披萨调料2");
    }

    @Override
    void cut() {
        System.out.println("纽约芝士披萨版切片...");
    }
}
/**
 * 纽约蛤蜊披萨
 * @author skysea
 */
public class NYStyleClamPizza extends Pizza {
    public NYStyleClamPizza() {
        name = "纽约蛤蜊披萨";
        dough = "纽约蛤蜊披萨面团";
        sauce = "纽约蛤蜊披萨酱料";

        toppings.add("纽约蛤蜊披萨佐料1");
        toppings.add("纽约蛤蜊披萨佐料2");
    }

    @Override
    void cut() {
        System.out.println("纽约蛤蜊披萨版切片...");
    }
}
/**
 * 纽约意大利烤肠披萨
 * @author skysea
 */
public class NYStylePepperoniPizza extends Pizza {
    public NYStylePepperoniPizza() {
        name = "纽约意大利烤肠披萨";
        dough = "纽约意大利烤肠披萨面团";
        sauce = "纽约意大利烤肠披萨酱料";

        toppings.add("纽约意大利烤肠披萨调料1");
        toppings.add("纽约意大利烤肠披萨调料2");
        toppings.add("纽约意大利烤肠披萨调料3");
        toppings.add("纽约意大利烤肠披萨调料4");
    }

    @Override
    void cut() {
        System.out.println("纽约意大利烤肠披萨版切片...");
    }
}
/**
 * 纽约素食比萨
 * @author skysea
 */
public class NYStyleVeggiePizza extends Pizza {
    public NYStyleVeggiePizza() {
        name = "纽约素食比萨";
        dough = "纽约素食比萨的面团";
        sauce = "纽约素食比萨的酱料";

        toppings.add("纽约素食比萨调料1");
        toppings.add("纽约素食比萨调料2");
        toppings.add("纽约素食比萨调料3");
    }

    void cut() {
        System.out.println("纽约素食比萨版切片...");
    }
}
/**
 * 纽约芝士披萨
 * @author skysea
 */
public class NYStyleCheesePizza extends Pizza {

    public NYStyleCheesePizza() { 
        name = "纽约芝士披萨";
        dough = "纽约芝士披萨面团";
        sauce = "纽约芝士披萨酱料";

        toppings.add("纽约芝士披萨调料1");
        toppings.add("纽约芝士披萨调料2");
    }

    @Override
    void cut() {
        System.out.println("纽约芝士披萨版切片...");
    }
}
/**
 * 纽约蛤蜊披萨
 * @author skysea
 */
public class NYStyleClamPizza extends Pizza {
    public NYStyleClamPizza() {
        name = "纽约蛤蜊披萨";
        dough = "纽约蛤蜊披萨面团";
        sauce = "纽约蛤蜊披萨酱料";

        toppings.add("纽约蛤蜊披萨佐料1");
        toppings.add("纽约蛤蜊披萨佐料2");
    }

    @Override
    void cut() {
        System.out.println("纽约蛤蜊披萨版切片...");
    }
}
/**
 * 纽约意大利烤肠披萨
 * @author skysea
 */
public class NYStylePepperoniPizza extends Pizza {
    public NYStylePepperoniPizza() {
        name = "纽约意大利烤肠披萨";
        dough = "纽约意大利烤肠披萨面团";
        sauce = "纽约意大利烤肠披萨酱料";

        toppings.add("纽约意大利烤肠披萨调料1");
        toppings.add("纽约意大利烤肠披萨调料2");
        toppings.add("纽约意大利烤肠披萨调料3");
        toppings.add("纽约意大利烤肠披萨调料4");
    }

    @Override
    void cut() {
        System.out.println("纽约意大利烤肠披萨版切片...");
    }
}
/**
 * 纽约素食比萨
 * @author skysea
 */
public class NYStyleVeggiePizza extends Pizza {
    public NYStyleVeggiePizza() {
        name = "纽约素食比萨";
        dough = "纽约素食比萨的面团";
        sauce = "纽约素食比萨的酱料";

        toppings.add("纽约素食比萨调料1");
        toppings.add("纽约素食比萨调料2");
        toppings.add("纽约素食比萨调料3");
    }

    void cut() {
        System.out.println("纽约素食比萨版切片...");
    }
}

View Code

View Code

披萨倒是列完了,不过在骨子里的开销进程中,业务逻辑这么不难那是不恐怕的,想要改那怎样旗舰店披萨的类名是很艰辛的

披萨倒是列完了,不过在事实上的开支进度中,业务逻辑这么不难那是不容许的,想要改那怎么旗舰店披萨的类名是很劳苦的

相似要考虑:

一般要考虑:

1,是还是不是单机,有没有其余外部系统在调用

1,是否单机,有没有其余外部系统在调用

2,改动原来的代码有怎样利益,更易于驾驭啊?迭代了多少个本子之后垃圾代码太多了吧?

2,改动原来的代码有什么便宜,更便于精通呢?迭代了多少个版本之后垃圾代码太多了呢?

3,影响大十分小

3,影响大相当小

本来,笔者那边是随便造,你们啊,我就不知情了,嘿嘿嘿,所以碰到那种意况,一般的话要悠着点,看日子,也要看影响,开发正是如此,同一个效益,2天有2天的做法,5天有5天的做法,10天有10天的做法

本来,小编那里是随便造,你们啊,作者就不清楚了,嘿嘿嘿,所以碰着那种情景,一般的话要悠着点,看日子,也要看影响,开发正是如此,同三个意义,2天有2天的做法,5天有5天的做法,10天有10天的做法

披萨店改造:

披萨店改造:

/**
 * 披萨店抽象类
 * @author skysea
 */
public abstract class PizzaStore {

    abstract Pizza createPizza(String item);

    public Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type);
        System.out.println("--- 制作 " + pizza.getName() + " ---");
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}

/**
 * 芝加哥披萨店
 * @author skysea
 */
public class ChicagoPizzaStore extends PizzaStore {
    public static final String CHEESE = "cheese";
    public static final String VEGGIE = "veggie";
    public static final String CLAM = "clam";
    public static final String PEPPERONI = "pepperoni";
    Pizza createPizza(String item) {
        if (CHEESE.equals(item)) {
            return new ChicagoStyleCheesePizza();
        } else if (VEGGIE.equals(item)) {
            return new ChicagoStyleVeggiePizza();
        } else if (CLAM.equals(item)) {
            return new ChicagoStyleClamPizza();
        } else if (PEPPERONI.equals(item)) {
            return new ChicagoStylePepperoniPizza();
        } else {
            throw new NoSuchPizzaException(item);
        }
    }
}
/**
 * 披萨店抽象类
 * @author skysea
 */
public abstract class PizzaStore {

    abstract Pizza createPizza(String item);

    public Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type);
        System.out.println("--- 制作 " + pizza.getName() + " ---");
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}

/**
 * 芝加哥披萨店
 * @author skysea
 */
public class ChicagoPizzaStore extends PizzaStore {
    public static final String CHEESE = "cheese";
    public static final String VEGGIE = "veggie";
    public static final String CLAM = "clam";
    public static final String PEPPERONI = "pepperoni";
    Pizza createPizza(String item) {
        if (CHEESE.equals(item)) {
            return new ChicagoStyleCheesePizza();
        } else if (VEGGIE.equals(item)) {
            return new ChicagoStyleVeggiePizza();
        } else if (CLAM.equals(item)) {
            return new ChicagoStyleClamPizza();
        } else if (PEPPERONI.equals(item)) {
            return new ChicagoStylePepperoniPizza();
        } else {
            throw new NoSuchPizzaException(item);
        }
    }
}

伦敦披萨店(和伊斯坦布尔披萨店大概一毛一样,那里就不开始展览了):

London披萨店(和多伦多披萨店差不多一毛一样,那里就不实行了):

betvictor1946 37betvictor1946 38

betvictor1946 39betvictor1946 40

/**
 * 纽约披萨店
 * @author skysea
 */
public class NYPizzaStore extends PizzaStore {

    public static final String CHEESE = "cheese";
    public static final String VEGGIE = "veggie";
    public static final String CLAM = "clam";
    public static final String PEPPERONI = "pepperoni";
    Pizza createPizza(String item) {
        if (CHEESE.equals(item)) {
            return new NYStyleCheesePizza();
        } else if (VEGGIE.equals(item)) {
            return new NYStyleVeggiePizza();
        } else if (CLAM.equals(item)) {
            return new NYStyleClamPizza();
        } else if (PEPPERONI.equals(item)) {
            return new NYStylePepperoniPizza();
        } else {
            throw new NoSuchPizzaException(item);
        }
    }
}
/**
 * 纽约披萨店
 * @author skysea
 */
public class NYPizzaStore extends PizzaStore {

    public static final String CHEESE = "cheese";
    public static final String VEGGIE = "veggie";
    public static final String CLAM = "clam";
    public static final String PEPPERONI = "pepperoni";
    Pizza createPizza(String item) {
        if (CHEESE.equals(item)) {
            return new NYStyleCheesePizza();
        } else if (VEGGIE.equals(item)) {
            return new NYStyleVeggiePizza();
        } else if (CLAM.equals(item)) {
            return new NYStyleClamPizza();
        } else if (PEPPERONI.equals(item)) {
            return new NYStylePepperoniPizza();
        } else {
            throw new NoSuchPizzaException(item);
        }
    }
}

View Code

View Code

那段代码有四个难点要清楚掌握:

那段代码有七个难题要掌握驾驭:

1,这一个地点怎么要弄个抽象类出来?

1,这些地点为啥要弄个抽象类出来?

这些将要结合实际来精通了,分店与分店之间,需不须要统一规范化管理?需不须要保证自身的特性?答案肯定,都以急需的

本条将要结合实际来通晓了,分店与分店之间,需不须要统一规范化管理?需不须求保证本身的特点?答案自然,都以供给的

那么些地点创造披萨的进程,毫无疑问是任其自然要一致的。就好像外卖一样,下单,炒菜,配送。整套流程都是那般,不能够说您出去就开端炒菜了啊,那不科学。不相同等的地点正是,你炒的什么菜,好不可口。配送得快相当慢,稳不稳,服务好倒霉。

以此地点创建披萨的进程,毫无疑问是迟早要一如既往的。就如外卖一样,下单,炒菜,配送。整套流程都以这么,无法说您出去就起来炒菜了呀,那不科学。区别的地方正是,你炒的怎么样菜,好不佳吃。配送得快相当的慢,稳不稳,服务好不佳。

就此,抽象类的含义正是:规范、特色

因而,抽象类的含义正是:规范、特色

2,factory咋个不见了?

2,factory咋个不见了?

因为把它和切实的store合并在一起了,那样又引申出其它叁个题目:为什么要统一?因为store未来充当的剧中人物便是facotry,刚才说过的制作进程已经松手父类中贯彻了,未来只要求在切实的store中去解决披萨的创立难点

因为把它和切实的store合并在一块儿了,这样又引申出此外一个标题:为什么要统一?因为store以后充当的剧中人物就是facotry,刚才说过的构建进程已经停放父类中贯彻了,以后只要求在现实的store中去消除披萨的创导难点

3,为何又不用枚举了,弄个String来创建pizza?

3,为什么又不要枚举了,弄个String来创建pizza?

假设照旧单机,用枚举当然会比直接扔个string来得服服帖帖。

借使还是单机,用枚举当然会比直接扔个string来得服服帖帖。

开了分集团,假如每一个子集团都以一套完整的劳动在玩,丢个string,要比枚举来得好。原因有2:传输进程中的体系化和反类别化、特别灵敏(客户端不用每一回都归因于那个缘故要去提高对应的包,越发是四个本子在跑得时候,升级了又会造成其余东西无法玩)

开了分店,假若每种子公司都以一套完整的服务在玩,丢个string,要比枚举来得好。原因有2:传输进度中的体系化和反系列化、越发灵活(客户端不用每一回都因为那么些缘故要去提高对应的包,尤其是四个版本在跑得时候,升级了又会招致别的东西不可能玩)

测试类:

测试类:

/**
 * 披萨测试类
 * @author skysea
 */
public class PizzaTest {

    public static void main(String[] args) {
        PizzaStore nyStore = new NYPizzaStore();
        PizzaStore chicagoStore = new ChicagoPizzaStore();

        Pizza pizza = nyStore.orderPizza(NYPizzaStore.CHEESE);
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");

        pizza = chicagoStore.orderPizza(ChicagoPizzaStore.CHEESE);
        System.out.println("Joel ordered a " + pizza.getName() + "\n");

        pizza = nyStore.orderPizza(NYPizzaStore.CLAM);
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");

        pizza = chicagoStore.orderPizza(ChicagoPizzaStore.CLAM);
        System.out.println("Joel ordered a " + pizza.getName() + "\n");

        pizza = nyStore.orderPizza(NYPizzaStore.PEPPERONI);
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");

        pizza = chicagoStore.orderPizza(ChicagoPizzaStore.PEPPERONI);
        System.out.println("Joel ordered a " + pizza.getName() + "\n");

        pizza = nyStore.orderPizza(NYPizzaStore.VEGGIE);
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");

        pizza = chicagoStore.orderPizza(ChicagoPizzaStore.VEGGIE);
        System.out.println("Joel ordered a " + pizza.getName() + "\n");
    }
}
/**
 * 披萨测试类
 * @author skysea
 */
public class PizzaTest {

    public static void main(String[] args) {
        PizzaStore nyStore = new NYPizzaStore();
        PizzaStore chicagoStore = new ChicagoPizzaStore();

        Pizza pizza = nyStore.orderPizza(NYPizzaStore.CHEESE);
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");

        pizza = chicagoStore.orderPizza(ChicagoPizzaStore.CHEESE);
        System.out.println("Joel ordered a " + pizza.getName() + "\n");

        pizza = nyStore.orderPizza(NYPizzaStore.CLAM);
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");

        pizza = chicagoStore.orderPizza(ChicagoPizzaStore.CLAM);
        System.out.println("Joel ordered a " + pizza.getName() + "\n");

        pizza = nyStore.orderPizza(NYPizzaStore.PEPPERONI);
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");

        pizza = chicagoStore.orderPizza(ChicagoPizzaStore.PEPPERONI);
        System.out.println("Joel ordered a " + pizza.getName() + "\n");

        pizza = nyStore.orderPizza(NYPizzaStore.VEGGIE);
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");

        pizza = chicagoStore.orderPizza(ChicagoPizzaStore.VEGGIE);
        System.out.println("Joel ordered a " + pizza.getName() + "\n");
    }
}

结果(结果太多了,就不全体截图出来了):

结果(结果太多了,就不全部截图出来了):

betvictor1946 41

betvictor1946 42

 

 

 

 

相关文章