{"id":343,"date":"2026-06-29T18:31:28","date_gmt":"2026-06-29T18:31:28","guid":{"rendered":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/?p=343"},"modified":"2026-06-29T20:55:40","modified_gmt":"2026-06-29T20:55:40","slug":"343","status":"publish","type":"post","link":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/2026\/06\/29\/343\/","title":{"rendered":"Factory &#8211; When new Becomes a Problem"},"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\/2026\/06\/Designer-1-1-1024x683.png\" alt=\"\" class=\"wp-image-398\" srcset=\"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/wp-content\/uploads\/2026\/06\/Designer-1-1-1024x683.png 1024w, https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/wp-content\/uploads\/2026\/06\/Designer-1-1-300x200.png 300w, https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/wp-content\/uploads\/2026\/06\/Designer-1-1-768x512.png 768w, https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/wp-content\/uploads\/2026\/06\/Designer-1-1.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">When you start coding, creating objects is simple:<\/p>\n\n\n<p>Product product = new Product();<\/p>\n\n\n<p class=\"wp-block-paragraph\">But as your application grows, object creation often becomes&#8230; messy.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Different variants of the same object<\/li>\n\n\n\n<li>Complex initialization logic<\/li>\n\n\n\n<li>Conditional creation based on input<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">At some point, <code>new<\/code> stops being enough.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That\u2019s where the <strong>Factory pattern<\/strong> comes in.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">The Problem: Scattered Object Creation<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Let\u2019s say you\u2019re building a payment system:<\/p>\n\n\n<pre style=\"padding-left: 80px;\"><!--ScriptorStartFragment--><\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">public interface Payment {<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 void process();<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">public class CreditCardPayment implements Payment {<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void process() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;Processing credit card payment&#8221;);<\/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;\">}<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">public class PayPalPayment implements Payment {<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void process() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;Processing PayPal payment&#8221;);<\/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\">Now imagine using it:<\/p>\n\n\n<pre style=\"padding-left: 80px;\"><!--ScriptorStartFragment--><\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">Payment payment;<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">if (type.equals(&#8220;card&#8221;)) {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 payment = new CreditCardPayment();<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">} else if (type.equals(&#8220;paypal&#8221;)) {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 payment = new PayPalPayment();<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">} else {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 throw new IllegalArgumentException(&#8220;Unknown payment type&#8221;);<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<!--ScriptorEndFragment--><\/div>\n\n\n<p class=\"wp-block-paragraph\">Problems that occurs:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Logic spread across the codebase<\/li>\n\n\n\n<li>Hard to extend (add a new payment = update everywhere)<\/li>\n\n\n\n<li>Violates Open\/Closed Principle<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">The Solution: Factory<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Encapsulate object creation in one place.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Factory Class Example:<\/p>\n\n\n<pre style=\"padding-left: 80px;\"><!--ScriptorStartFragment--><\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">public class PaymentFactory {<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public static Payment createPayment(String type) {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 switch (type.toLowerCase()) {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case &#8220;card&#8221;:<\/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 return new CreditCardPayment();<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case &#8220;paypal&#8221;:<\/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 return new PayPalPayment();<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 default:<\/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 throw new IllegalArgumentException(&#8220;Unknown payment type&#8221;);<\/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<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<\/div>\n<pre style=\"padding-left: 80px;\"><!--ScriptorEndFragment--><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Usage Example would be:<\/p>\n\n\n<pre style=\"padding-left: 80px;\">Payment payment = PaymentFactory.createPayment(\"paypal\");<br \/>payment.process();<\/pre>\n\n\n<p class=\"wp-block-paragraph\">Benefits of this approach:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Centralized creation <\/li>\n\n\n\n<li>Cleaner business logic <\/li>\n\n\n\n<li>Easier to extend <\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">When Should You Use Factory?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Factory is a great fit when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You have <strong>multiple implementations of an interface<\/strong><\/li>\n\n\n\n<li>Creation logic depends on <strong>conditions or configuration<\/strong><\/li>\n\n\n\n<li>You want to <strong>hide implementation details<\/strong><\/li>\n\n\n\n<li>You need to <strong>decouple usage from instantiation<\/strong><\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">When avoiding Factories?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid Factory when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You create <strong>simple objects<\/strong><\/li>\n\n\n\n<li>There\u2019s no variation in implementations<\/li>\n\n\n\n<li>You don\u2019t need abstraction<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>When you start coding, creating objects is simple: Product product = new Product(); But as your application grows, object creation often becomes&#8230; messy. At some point, new stops being enough. That\u2019s where the Factory pattern comes in. The Problem: Scattered Object Creation Let\u2019s say you\u2019re building a payment system: public interface Payment { \u00a0 \u00a0\u00a0\u00a0 [&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-343","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\/343","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=343"}],"version-history":[{"count":12,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/343\/revisions"}],"predecessor-version":[{"id":399,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/343\/revisions\/399"}],"wp:attachment":[{"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/media?parent=343"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/categories?post=343"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/tags?post=343"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}