代码之家  ›  专栏  ›  技术社区  ›  Nir

编译时的工厂模式

  •  0
  • Nir  · 技术社区  · 7 年前

    我正在努力找出这个问题的正确设计

    我有三个类:线程、消费者和事件

    public class Thread {
        private Consumer _consumer = new Consumer();
    }
    
    public class Consumer {
        private someMethod() {
            Event event = new Event();
            // do something with event 
        }
    }
    

    在我的“main”中,创建了t,并封装了它的依赖项

    Thread t = new Thread();
    

    现在设计已经改变了,我们需要多个 Consumer s和它们中的每一个都应该构造一个不同的 Event .所有的代码都一样,所以我不需要更改 消费者 .

    我试着用仿制药来做,因为看起来这是一种简单而干净的方法。但是,似乎不可能使用 新的 在泛型类型上。 (被C++模板误导)

    public class Thread<T extends Event> {
        private Consumer _c = new Consumer<T>();
    }
    
    public class Consumer<T extends Event> {
        private someMethod() {
            Event event = new T();
        }
    }
    

    我的另一个选择是通过某种编译时工厂

    public interface IEventFactory {
        public Event create();
    }
    
    public class EventFactory implements IEventFactory{
        public Event create() {
            return new Event1();
        }
    }
    
    public class Thread {
        private Consumer _consumer;
    
        public Thread (IEventFactory _factory) {
            _consumer = new Consumer(_factory);
        }
    }
    
    public class Consumer {
        private IEventFactory _factory;
    
        public C(IEventFactory factory) {
            _factory = factory;
        }
    
        private someMethod() {
            Event event = _factory.create();
        }
    }
    

    这个解决方案在经过工厂的时候感觉不那么优雅。 有没有更好更优雅的方式来处理这个问题?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Michael    7 年前

    工厂在这里只增加了样板。使用方法引用可以完成相同的事情:传递 Event 的构造函数转换为 Consumer 的构造函数。使用 Supplier 这样做的功能接口。

    public class Consumer<T extends Event> {
        private final Supplier<T> eventConstructor;
    
        public Consumer(final Supplier<T> eventConstructor) {
            this.eventConstructor = eventConstructor;
        }
    
        private void someMethod() {
            final T event = eventConstructor.get();
        }
    }
    

    您可以从 Thread 以下内容:

    class Thread<T extends Event> {
        private Consumer<T> consumer;
    
        public Thread(final Supplier<T> eventConstructor) {
            this.consumer = new Consumer<>(eventConstructor);
        }
    }
    

    样品用途:

    Thread<Event1> thr = new Thread<>(Event1::new);
    

    如果某些事件具有构造函数参数,例如:

    Thread<Event2> thr2 = new Thread<>(() -> new Event2("some default"));
    
    推荐文章