java - 最佳使用的创意设计模式

标签 java design-patterns factory builder

我正在编写一些需要抽象 HttpClient 创建的代码。 Http 客户端将是 org.apache.http.client.HttpClient 的实例。 Http 客户端的配置将根据配置信息(即是否是 post/get 请求、基本身份验证、可能是一些 header 等)而有所不同。

为了实现这一点,我正在考虑使用工厂设计模式,它将抽象 Http 客户端的创建;但是,我想知道构建器模式是否是更好的选择。

我已经看过有关此主题的几篇文章(见下文),似乎主要区别在于创建实例所需的复杂性。在下面的一篇文章中,它说工厂是构造函数的包装器,当工厂创建对象时,所有事情都应该在一行上完成。

问题: 1. 如果创建 HttpClient 需要执行一些额外的步骤(即创建实例、设置一些参数等),我是否违反了工厂模式并应该使用构建器?

类似帖子:

  1. What is the difference between Builder Design pattern and Factory Design pattern?

  2. https://myjavalatte.wordpress.com/tag/builder-pattern-vs-factory-pattern/

  3. Difference between Abstract factory and builder?

最佳答案

会有很多配置可能性,因此构建器模式最适合您的问题。一步创建时更推荐工厂模式。

请注意,http-client 有一个 HttpClientBuilder 实现: http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/HttpClientBuilder.html

在内部,您可以混合这两种模式。示例:

new HttpClientBuilder()
      .setSomeParameter(MyEnum.VALUE)
      .build();

然后在构建具体的 HttpBuilder 时,您可以使用工厂根据 someParameter 值创建一些实例:

public void HttpClient build() {
    HttpClient client = ...
    SomeAdditionalClass instance = SomeAdditionalClassFactory.create(this.someParameter); // one-step creation
    client.setSomeAttribute(instance);
    ...
    return client;
}

关于java - 最佳使用的创意设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35415180/

相关文章:

java - 构建 JPA Criteria API 查询 - 按集合中的元素数排序

java - 如何使用JJTree构建抽象语法树?

java - HashBasedTable 表<String,String,Double> HashMap<String,Double>

c# - RavenDB 中的 'heavy' 聚合函数是否可取?

java - 使用装饰器模式时如何保留接口(interface)?

ios - UIKit 背后的设计模式

python - Factory Boy 随机选择字段选项 "choices"

java - 如何从具有多种对象类型的集合中只读取一种类型的特定对象

java - 如何让 PicoContainer 启动/停止/处置工厂注入(inject)的组件?

scala - 如何避免在 Scala 中使用 asInstanceOf