Choosing Between Factory and Builder Patterns: A Practical Guide with Examples

Nikolay Nikolov
3 min readOct 27, 2023

--

As a developer, the eternal dilemma of whether to employ the Factory pattern or the Builder pattern often looms large when faced with object creation. In this article, we delve into the intricacies of each pattern, providing detailed examples to guide you in making informed decisions.

Factory Pattern in Action: Simplifying Object Creation

The Factory pattern shines when object creation is straightforward and lacks complex configuration steps. Consider the following example:

class Product
{
public function __construct(
private string $name,
private float $price
) {}

public function getName(): string
{
return $this->name;
}

public function getPrice(): float
{
return $this->price;
}
}

class ProductFactory
{
public static function createProduct(string $name, float $price): Product
{
return new Product($name, $price);
}
}

// Usage
$product = ProductFactory::createProduct('Example Product', 29.99);

When to Opt for the Factory Pattern:

  1. Simple Object Creation: Use the Factory pattern when the creation of objects is straightforward.
  2. Common Interface: Choose it if you want to encapsulate object creation logic and provide a common interface for creating different types of objects.

Builder Pattern: Crafting Complex Objects with Elegance

In contrast, the Builder pattern excels when object construction is intricate, involves multiple steps, or demands optional and customizable features. Observe the following Builder pattern example:

class Product
{
public function __construct(
private string $name,
private float $price
) {}

public function getName(): string
{
return $this->name;
}

public function getPrice(): float
{
return $this->price;
}
}

class ProductBuilder
{
private string $name;
private float $price;

public function setName(string $name): self
{
$this->name = $name;

return $this;
}

public function setPrice(float $price): self
{
$this->price = $price;

return $this;
}

public function build(): Product
{
return new Product($this->name, $this->price);
}
}

// Usage
$product = (new ProductBuilder())
->setName('Example Product')
->setPrice(29.99)
->build();

When to Embrace the Builder Pattern:

  1. Complex Object Construction: Opt for the Builder pattern when object construction involves multiple steps or has optional, customizable features.
  2. Fluent Interface: Choose it if you desire a fluent interface for a clear and readable step-by-step construction process.

In Conclusion: Making the Right Choice

In summary, the decision between the Factory and Builder patterns boils down to the nature of your object creation process. Choose the Factory pattern for simplicity and a common interface, while the Builder pattern excels in handling complex constructions with elegance. Armed with these insights and examples, you can now confidently navigate the nuanced landscape of design patterns in your development journey.

If you enjoyed this, subscribe to my future articles, follow me if you like 🚀

Clap 👏🏻, drop a comment 💬, and share this article with anyone you think would find it valuable.

Thank you for your support!

For further exploration, you can also delve into my other articles, such as “Mastering the Factory Pattern with Practical Examples” or “Mastering the Builder Design Pattern with Practical Examples”.

Happy coding!

--

--

Nikolay Nikolov

Head of Software Development at CONUTI GmbH | 20 years experience | Passionate about clean code, design patterns, and software excellence.