gpt4 book ai didi

java - 开闭原则在Java中的应用

转载 作者:行者123 更新时间:2023-11-29 04:49:19 24 4
gpt4 key购买 nike

我试图理解 SOLID 原则,因此实现了一些 Java 代码片段。我现在关心的是 OCP。有以下样本,

public abstract class Bakery
{
public abstract Bakegood bake();
}

/******************************************/

public class BreadBakery extends Bakery {
@Override
public Bakegood bake() {
return new Bread();
}
}

/******************************************/

public class CakeBakery extends Bakery {
@Override
public Bakegood bake() {
return new Cake();
}
}

/******************************************/

我怎样才能创建合适的面包店。假设一位顾客来到面包店并说:“请给我两个蛋糕!”,然后我如何实例化 CakeBakery。当然我可以像这样创建一个抽象工厂:

public static Bakery createBakery(final String orderedBakegood)
{
switch(bakegood)
{
case "Cake": return new CakeBakery();
case "Bread": return new BreadBakery();
default: throw new InvalidBakeryException();
}
}

但我不想使用 switch 或 if 语句。是否还有其他可能性,或者我的理解完全错误?

最佳答案

开闭原则说:

Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.

因此,无论何时引入新的 Bakery,都不应修改现有代码。您可以为您的 Bakery 类使用注册表之类的东西。如果您需要添加一个新的 Bakery,只需扩展 Bakery 类并注册它(例如在启动时)。因此不需要“if”或“switch”修改。此外,添加新的 Bakery 不需要更改注册表的内部结构或调用注册表的代码。

此外,此技术不依赖于您注册组件的方式。您可以通过类路径扫描,使用配置文件(xml,...)以编程方式进行,...

你可以在 Spring 框架中看到很多这种方法。基本上,Spring 框架是许多设计原则的重要来源。

在这里您可以看到一个非常简单的注册表实现。

public class BakeryRegistry {

private Map<String, Bakery> mapping = new HashMap<>();

public BakeryRegistry() {
loadDefaultMappingFromConfigFile();
}

public Bakery getBakery(String name) {
return mapping.get(name);
}

public void registerBakery(String name, Bakery bakery) {
mapping.put(name, bakery);
}

private void loadDefaultMappingFromConfigFile() {
...
}
}

也许文章 Killing Switch Statements With A Registry可以帮助。它基于 JavaScript 但原理是相同的。

关于java - 开闭原则在Java中的应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36006645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com