我在最近的一次采访中被问到:
一个三明治应该恰好有两片面包 (每端一个),以及介于两者之间的任何正数的奶酪。
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());
您可以使用什么设计模式来确保每个实例化的三明治都是有效的三明治?
最佳答案
您可以使用 Builder
模式:用于非常复杂的多步骤对象构造,其中构造函数或方法参数的数量会高得离谱。
SandwichBuilder sb = new SandwichBuilder();
sb.addFirstBread(new BreadSlice());
sb.addCheese(new Cheese());
...
sb.addLastBread(new BreadSlice());
Sandwich s = sb.getSandwich();
如果在调用 .getSandwich()
时未正确完成,不完整的 SandwichBuilders
可能会抛出某种类型的 IncompleteSandwichException
。
注意:使用正确命名的构造方法,您无需按特定顺序执行任何操作。
或者您可以使用 FactoryMethod
模式:当步骤数适合具有合理数量参数的单个方法调用时,并且应保证对象是完整的状态。
BreadSlice bs1 = new BreadSlice();
BreadSlice bs2 = new BreadSlice();
List<Cheese> cheeses = new ArrayList<Cheese>();
...
Sandwich s = SandwichBuilder.buildSandwich(bs1, cheeses, bs2);
或者使用构造函数
:它是FactoryMethod
模式的特例
Sandwich s = new Sandwich(bs1, cheeses, bs2);
重载构造函数以允许添加奶酪:
Sandwich s = new Sandwich(bs1, bs2);
s.addCheese(new CheeseSlice());
...
有很多方法可以做到这一点,具体取决于您希望构造的严格程度。
例如,您可以使 Sandwich
实现成为 Factory/Builder
对象的 内部类
,并将其构造函数设为 private
所以它不能被错误地实例化。
关于java - 使用哪种设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5656279/