java - 使用哪种设计模式?

标签 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());

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

最佳答案

您可以使用 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/

相关文章:

java - 使用 DataSource 的 Wildfly 配置

java - 无法解析方法 setCookieHandler (java.net.CookieManger

c# - 构建验证服务层

c# - 如何在交易中保存?

c# - 如何在列表中(同时)应用多个过滤条件?

JavaScript 代码组织建议/代码审查

java - Spring MVC 表 blob 字段转 json

java - 如何清除 Android WebView 的(CSS)访问历史记录?

java - 为我的类中使用的通用 pojo 建模

java - Oracle 数据源连接池不适用于 Spring 和 JDBCTemplate