Start here. This is the direct spoken answer to practice first.
Why this question matters
I use a constructor when required inputs are small and construction has one clear meaning. A static factory helps when creation needs a name, validation result, subtype choice, caching, or more than one meaningful path. A builder helps assemble many optional parts or a staged complex object.
I use a constructor for one clear creation path, a named factory for multiple or fallible paths, and a builder for genuinely complex staged assembly. An Order constructor can require customer identity and keep the new order valid. Order.TryCreate can return validation errors without throwing for expected input failure, while Order.Restore can make a separate persistence path explicit. A builder is useful for complex configuration, but it is excessive for three required values. Object initializers suit simple data shapes, not invariant bypasses.