How would you replace Factory design patterns in functional programming?
Before someone else says it - with a function
interface ThingFactory {
    Thing makeThing();
}
...
void work(ThingFactory factory) {
    var thing = factory.makeThing();
    thing.whatever();
}(defn work [factory]
  (let [thing (factory)]
    (.whatever thing)))You can also use the exact pattern as is (where the producer method gets a special name) with traits/typeclasses/protocols depending on your FP language