使用哪种设计模式?

kc3*_*kc3 2 java design-patterns

我在最近的一次采访中被问到:

三明治应该有两片面包(每端一片),中间有任何正数的奶酪.

Sandwich s = new Sandwich();
s.add(new BreadSlice());
s.add(new CheddarCheese());
s.add(new SwissCheese());
s.add(new BreadSlice());
System.println("My sandwich: "+ s.toString());
Run Code Online (Sandbox Code Playgroud)

您可以使用什么设计模式来确保实例化的每个三明治都是有效的三明治?

小智 9

您可以使用Builder模式:用于非常复杂的多步对象构造,其中构造函数或方法参数的数量将非常高.

SandwichBuilder sb = new SandwichBuilder();
sb.addFirstBread(new BreadSlice());
sb.addCheese(new Cheese());
...
sb.addLastBread(new BreadSlice());
Sandwich s = sb.getSandwich();
Run Code Online (Sandbox Code Playgroud)

不完全SandwichBuilders可能会引发某种IncompleteSandwichException时候如果没有正确完成.getSandwich()被调用.

注意: 使用正确命名的构造方法,您无需按特定顺序执行任何操作.

或者您可以使用一种FactoryMethod模式:当步数适合具有合理数量的参数的单个方法调用时,应该保证该对象是完整状态.

BreadSlice bs1 = new BreadSlice();
BreadSlice bs2 = new BreadSlice();
List<Cheese> cheeses = new ArrayList<Cheese>();
...
Sandwich s = SandwichBuilder.buildSandwich(bs1, cheeses, bs2);
Run Code Online (Sandbox Code Playgroud)

或者使用Constructor:这是一种特殊的FactoryMethod模式案例

Sandwich s = new Sandwich(bs1, cheeses, bs2);
Run Code Online (Sandbox Code Playgroud)

重载构造函数以允许添加奶酪:

Sandwich s = new Sandwich(bs1, bs2);
s.addCheese(new CheeseSlice());
...
Run Code Online (Sandbox Code Playgroud)

有很多方法可以做到这一点取决于你想要的结构有多严格.例如,可以使Sandwich执行的inner class对的Factory/Builder对象,并使其构造private,因此无法在-正确实例.


Geo*_*Geo 6

我认为Builder模式在这里可能是个不错的选择.