小编Luk*_*uke的帖子

何时使用抽象工厂模式?

我试图简洁地描述何时使用工厂,我自己和我的团队.我遇到了以下相关问题,这有点帮助:

基于这些链接以及一系列其他来源(在下面列出),我提出了以下内容:

何时使用抽象工厂模式:

  • 当您使用接口var或'new'运算符时
    • 例如,User user = new ConcreteUserImpl();
  • 并且您正在编写的代码在某些时候应该是可测试/可扩展的

说明:

  • 接口本质上意味着多个实现(适用于单元测试)
  • 接口变量意味着符合OCP和LSP的代码(支持子分类)
  • 使用'new'运算符会破坏OCP/DI,因为高度耦合的类很难测试或更改

"我是否为每种对象类型创建了一个工厂?这看起来过分了."

  • 不,你可以有一个(或几个)工厂生产很多(通常是相关的)对象类型
  • 例如appFactory.createUser(); appFactory.createCatalog(); 等等

何时不使用工厂:

  • 新对象非常简单,不太可能被细分
    • 例如List list = new ArrayList();
  • 新对象测试不是很有趣
    • 没有依赖关系
    • 不执行任何相关或长期工作
    • 例如Logger log = new SimpleLogger();

参考文献:


我的问题是:我的摘要是否准确,是否有意义?有什么我忽略的吗?

提前致谢.

language-agnostic oop design-patterns factory factory-pattern

18
推荐指数
2
解决办法
1万
查看次数

Project Reactor,在创建 lambda 之外使用 Flux sink

  • 当我的服务启动时,我想构建一个简单的管道。
  • 我想隔离 Flux 接收器或处理器来发出事件。
  • 事件将来自多个线程,应该根据管道的subscribeOn()规范进行处理,但一切似乎都在main线程上运行。
  • 最好的方法是什么?我在下面附上了我的尝试。
  • (我正在使用 reactor-core v3.2.8.RELEASE。)
import org.junit.jupiter.api.Test;

import reactor.core.publisher.DirectProcessor;
import reactor.core.publisher.Flux;
import reactor.core.publisher.FluxProcessor;
import reactor.core.publisher.FluxSink;
import reactor.core.scheduler.Schedulers;

/**
 * I want to construct my React pipelines during creation,
 * then emit events over the lifetime of my services.
 */
public class React1Test
{
    /**
     * Attempt 1 - use a DirectProcessor and send items to it.
     * Doesn't work though - seems to always run on the main thread.
     */
    @Test
    public …
Run Code Online (Sandbox Code Playgroud)

java reactor project-reactor

6
推荐指数
1
解决办法
2925
查看次数

JDK 15 密封类 - 如何跨包使用?

我有一个简单的密封类,MyShape

public sealed class MyShape permits MyCircle {

    private final int width;
    private final int height;

    public MyShape(int width, int height) {
        this.width = width;
        this.height = height;
    }

    public int width() {
        return width;
    }

    public int height() {
        return height;
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个简单的子类MyCircle

public final class MyCircle extends MyShape {

    public MyCircle(int width) {
        super(width, width);
    }
}
Run Code Online (Sandbox Code Playgroud)

当两个类都在同一个包中时,一切都会编译并运行。如果我移动到MyCircle子包,然后构建打破了:java: class is not allowed to extend sealed class: org.example.MyShape

我对JDK 15 文档的 …

java sealed-class java-15 java-sealed-type

5
推荐指数
1
解决办法
143
查看次数