gpt4 book ai didi

c# - 什么时候应该使用抽象工厂模式

转载 作者:太空狗 更新时间:2023-10-30 01:18:40 27 4
gpt4 key购买 nike

我一直在阅读抽象工厂模式,但即使我理解它,我也不知道何时使用它。该模式的定义说它用于抽象对象实例化,但我不太清楚为什么我需要这样做,为什么我应该关心对象实例化以及为什么(或何时)抽象很重要

最佳答案

该模式的主要好处是它通过将对象创建与对象使用分离来实现干净且可重用的代码。

不幸的是,我手边没有 C# 示例,但本周我遇到的一个示例用例是设计一个需要打开套接字的对象。这是在 Android 上,某些版本错误地实现了 SSL/TLS。

要解决此错误,在这些版本的 Android 上,我们必须对 SSL 环境进行大量自定义才能成功与后端对话。使用抽象工厂允许我们编写套接字客户端,这样它就不需要知道任何关于困惑的细节——它只需要一个工厂来从中获取套接字。

一个例子:

// this is pretty gross, but what can you do
public class SocketFactorySupplier implements Supplier<SSLSocketFactory> {
@Override public SSLSocketFactory get() {
if (androidVersion >= 2.1 && androidVersion <= 2.6) {
return createShiftyWorkaround();
} else {
return getDefaultSocketFactory();
}
}

// here are ~500 lines of SSL code
}

...

public class NetworkClient {
private final Supplier<SSLSocketFactory> supplier;
private Socket socket;

public NetworkClient(Supplier<SSLSocketFactory> supplier) {
this.supplier = supplier;
}

public void connect() {
socket = supplier.get().createSocket();
socket.connect();

// code that doesn't care about SSL at all and is simpler for it
}
}

这显然不是真正的代码,但它展示了抽象工厂模式的主要优点:

  • NetworkClient 代码更简洁,因为它不关心套接字是如何构建的
  • 可以通过提供模拟套接字轻松测试客户端,将其与网络隔离
  • SSL 逻辑可以在其他需要套接字的类中重用
  • 等等

关于c# - 什么时候应该使用抽象工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26291178/

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