{"id":1,"date":"2025-05-13T21:24:30","date_gmt":"2025-05-13T21:24:30","guid":{"rendered":"http:\/\/instalatorwp671.dkonto.pl\/?p=1"},"modified":"2026-06-29T20:54:39","modified_gmt":"2026-06-29T20:54:39","slug":"patterns-builder","status":"publish","type":"post","link":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/2025\/05\/13\/patterns-builder\/","title":{"rendered":"Builder \u2013 When a Constructor Is Not Enough"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/05\/Designer-1024x683.png\" alt=\"\" class=\"wp-image-396\" srcset=\"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/05\/Designer-1024x683.png 1024w, https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/05\/Designer-300x200.png 300w, https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/05\/Designer-768x512.png 768w, https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/05\/Designer.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine you need to create an object with a dozen fields \u2014 some required, some optional, some dependent on each other, and some that must be set in a specific order.<br><br>Sounds like a nightmare for a constructor and Programmer that has to re-apply everything in appropriate order?<br><br>That\u2019s exactly where the <strong>Builder pattern<\/strong> comes in. It turns parameter chaos into a clear, controlled process of building objects step by step.<br><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">The Problem: Constructor Hell<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Let\u2019s take a simple example \u2014 an order configuration:<\/p>\n\n\n<pre style=\"padding-left: 80px;\"><!--ScriptorStartFragment--><\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">public class Order {<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 private final String customer;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 private final String address;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 private final boolean isExpress;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 private final boolean giftWrap;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 private final String couponCode;<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public Order(String customer,<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 String address,<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 boolean isExpress,<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 boolean giftWrap,<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 String couponCode) {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.customer = customer;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.address = address;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.isExpress = isExpress;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.giftWrap = giftWrap;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.couponCode = couponCode;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<!--ScriptorEndFragment--><\/div>\n\n\n<p class=\"wp-block-paragraph\">Usage:<\/p>\n\n\n<p style=\"padding-left: 80px;\">Order order = new Order(&#8220;John Doe&#8221;, &#8220;Gdynia&#8221;, true, false, null);<\/p>\n\n\n<p class=\"wp-block-paragraph\">The problem here is it&#8217;s pretty hard to read. Additionally &#8211; every extension requires too much effort, not mentioning vulnerability for errors<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">The Solution: Builder<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of passing everything at once, we build the object step by step:<\/p>\n\n\n<p><!--ScriptorStartFragment--><\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">public class Order {<\/div>\n<p style=\"padding-left: 80px;\">\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 private final String customer;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 private final String address;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 private final boolean isExpress;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 private final boolean giftWrap;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 private final String couponCode;<\/div>\n<p style=\"padding-left: 80px;\">\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 private Order(Builder builder) {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.customer = builder.customer;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.address = builder.address;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.isExpress = builder.isExpress;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.giftWrap = builder.giftWrap;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.couponCode = builder.couponCode;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<p style=\"padding-left: 80px;\">\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public static class Builder {<\/div>\n<p style=\"padding-left: 80px;\">\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private String customer;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private String address;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private boolean isExpress;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private boolean giftWrap;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private String couponCode;<\/div>\n<p style=\"padding-left: 80px;\">\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public Builder forCustomer(String customer) {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.customer = customer;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return this;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/div>\n<p style=\"padding-left: 80px;\">\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public Builder shipTo(String address) {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.address = address;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return this;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/div>\n<p style=\"padding-left: 80px;\">\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public Builder withExpressDelivery() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.isExpress = true;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return this;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/div>\n<p style=\"padding-left: 80px;\">\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public Builder withGiftWrap() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.giftWrap = true;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return this;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/div>\n<p style=\"padding-left: 80px;\">\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public Builder withCoupon(String code) {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.couponCode = code;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return this;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/div>\n<p style=\"padding-left: 80px;\">\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public Order build() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return new Order(this);<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<p style=\"padding-left: 80px;\">\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<!--ScriptorEndFragment--><\/div>\n\n\n<p class=\"wp-block-paragraph\">Yes &#8211; it is much more in the class definition &#8211; hovewer it pays off. Usage looks as follow:<\/p>\n\n\n<p style=\"padding-left: 80px;\">Order order = new Order.Builder()<br \/>.forCustomer(&#8220;John Doe&#8221;)<br \/>.shipTo(&#8220;Gdynia&#8221;)<br \/>.withExpressDelivery()<br \/>.build();<\/p>\n\n\n<p class=\"wp-block-paragraph\">Benefits are most of all &#8211; readability. For Usage we only have to get this information we want and in whatever order we want. Extension is also easy &#8211; we only have to extend the class and the extension is ready to use. No need to go through the entire code to make changes &#8211; not anymore!<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">When do you want to use Builder?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">There is number of cases when that pattern is suitable. First of all &#8211; if you have plenty of optional parameters &#8211; the Builder is there for you. With constructors you have to pay attention to every possible detail &#8211; and with Builder only the ones you want in particular situation.<br>It also benefits with complex objects, when extending them through constructor sounds terrible. With Builder you do just what you want to.<br>API readability is mentioned as advantages as well. A simple Query below proves that:<\/p>\n\n\n<p style=\"padding-left: 80px;\">Query query = new Query.Builder()<br \/>.select(&#8220;name&#8221;, &#8220;price&#8221;)<br \/>.from(&#8220;products&#8221;)<br \/>.where(&#8220;price &gt; 100&#8221;)<br \/>.orderBy(&#8220;price DESC&#8221;)<br \/>.build();<\/p>\n\n\n<h4 class=\"wp-block-heading\">When avoiding Builders?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Builders are overkill for simple cases &#8211; if your class has like 4-5 fields and no extensions are coming in future &#8211; I would say you don&#8217;t need such a sophisticated solution in it. So Generally the Builder will be worse choice especially when the class you are concidering is something minor in your project &#8211; not too often used or just basically small.<br><br>The same goes for cases when you don&#8217;t need step-by-step configuration. Remember &#8211; always try to keep it as simple as situation allows to!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Imagine you need to create an object with a dozen fields \u2014 some required, some optional, some dependent on each other, and some that must be set in a specific order. Sounds like a nightmare for a constructor and Programmer that has to re-apply everything in appropriate order? That\u2019s exactly where the Builder pattern comes [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"saved_in_kubio":false,"footnotes":""},"categories":[11],"tags":[],"class_list":["post-1","post","type-post","status-publish","format-standard","hentry","category-pp"],"_links":{"self":[{"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/1","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1"}],"version-history":[{"count":13,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/1\/revisions"}],"predecessor-version":[{"id":397,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/1\/revisions\/397"}],"wp:attachment":[{"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}