I played around with this a few years ago in github.com/MasonProtter/PatternDispatch.jl julia> module PatternFruitFactory using PatternDispatch abstract type Fruit end struct Apple <: Fruit end struct Orange <: Fruit end @pattern fruit("apple") = Apple() @pattern fruit("orange") = Orange() @pattern fruit(s) = error("unknown fruit $s") end julia> @btime PatternFruitFactory.fruit("orange") 3.449 ns (0 allocations: 0 bytes) Main.PatternFruitFactory.Orange() These are extensible at a later time: julia> @btime PatternFruitFactory.fruit("banana") 7.537 ns (0 allocations: 0 bytes) Main.PatternFruitFactory.Banana() PatternDispatch.jl does some stuff that's unfriendly to precompilation though so it doesn't fit very well into packages. Very much just a proof of concept.