根据参数类类型创建一个新的实现类实例

时间:2019-06-13 09:11:26

标签: java design-patterns generic-programming

我将简要介绍一下我的代码结构:

  • Aaa类实现EventEmmiter

  • Bbb类实现EventEmmiter

  • Aaa类事件实现事件:

    public class AaaEvent implements Event {
    
        private final Aaa aaa;
    
        public AaaEvent(Aaa aaa) {
            this.aaa = aaa;
        }
    }
    
  • BbbEvent类实现事件:

    public class BbbEvent implements Event {
       private final Bbb bbb;
       public BbbEvent(Bbb bbb) {
       this.bbb = bbb;
       }
    }
    

我想创建一个“ createSomething”方法来避免代码重复。我希望此方法根据参数类型(可以是Aaa或Bbb)来创建从Event实现的类的新实例。

//已编辑

在下面,您可以找到可以正常运行的EventPublisher类,但看起来不太好。我想避免if / else或switch的实现,因为它会随着新类的增长而增长。

public class EventPublisher {
    public void createSomething(EventEmitter eventEmitter) {
        DomainEvent event = null;
        Class<? extends EventEmitter> eventClass = eventEmitter.getClass();
        if (eventClass.isAssignableFrom(Aaa.class)) {
            event = new AaaEvents((Aaa) eventEmitter);
        } else if (eventClass.isAssignableFrom(Bbb.class)) {
            event = new BbbEvents((Bbb) eventEmitter);
        } else if () {
            some next (eg.CccEvents) class
        }

        domainEventBus.publish(event);
    }
}

例如。如果作为方法参数传递的EventEmmiter的类型为Aaa,我想创建一个新的AaaEvent实例。

还有一件事。我不能使用AaaEvent的Aaa内包装。它在另一个方向上起作用。我可以在AaaEvent中使用Aaa包中的东西。

您能给我一些技巧来实现这些事情吗?

1 个答案:

答案 0 :(得分:3)

您要实现factory method pattern

public interface EventEmmiter {
    Event createEvent();
    ...
}

public class Aaa implements EventEmitter {
    @Override public AaaEvent createEvent() { return new AaaEvent(); }
    ...
}

public class Bbb implements EventEmitter {
    @Override public BbbEvent createEvent() { return new BbbEvent(); }
    ...
}

现在您可以简单地将其用作:

public void createSomething(EventEmitter eventEmitter) {
    Event someEvent = eventEmitter.createEvent();
    ...
}