{"id":36312,"date":"2025-12-13T13:40:53","date_gmt":"2025-12-13T10:40:53","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36312"},"modified":"2025-12-13T13:40:53","modified_gmt":"2025-12-13T10:40:53","slug":"javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/","title":{"rendered":"Java&#8217;da Builder Tasar\u0131m Deseni: Karma\u015f\u0131k Nesnelerin \u0130n\u015fas\u0131n\u0131 Y\u00f6netmek"},"content":{"rendered":"<p><body><\/p>\n<h2>Java&#8217;da Builder Tasar\u0131m Deseni: Karma\u015f\u0131k Nesnelerin \u0130n\u015fas\u0131n\u0131 Y\u00f6netmek<\/h2>\n<p>Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, kar\u015f\u0131la\u015f\u0131lan ortak sorunlara zarif ve yeniden kullan\u0131labilir \u00e7\u00f6z\u00fcmler sunan tasar\u0131m desenleri (design patterns) kritik bir rol oynar. Bu desenler, kodun s\u00fcrd\u00fcr\u00fclebilirli\u011fini, okunabilirli\u011fini ve esnekli\u011fini art\u0131rarak karma\u015f\u0131k sistemlerin in\u015fas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r. Yarat\u0131c\u0131 (Creational) tasar\u0131m desenleri kategorisinde yer alan Builder deseni, \u00f6zellikle karma\u015f\u0131k nesnelerin olu\u015fturulma s\u00fcrecini y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Bu makalede, Builder tasar\u0131m deseninin ne oldu\u011funu, hangi sorunlar\u0131 \u00e7\u00f6zd\u00fc\u011f\u00fcn\u00fc, nas\u0131l uyguland\u0131\u011f\u0131n\u0131 ve modern Java uygulamalar\u0131ndaki yerini detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h2>Builder Deseni&#8217;nin \u00c7\u00f6zd\u00fc\u011f\u00fc Sorunlar<\/h2>\n<p>Bir s\u0131n\u0131f\u0131n \u00e7ok say\u0131da parametresi oldu\u011funda, nesne olu\u015fturma s\u00fcreci h\u0131zla karma\u015f\u0131kla\u015fabilir. Bu durum, genellikle iki yayg\u0131n anti-desenle kendini g\u00f6sterir: &#8220;Telescoping Constructor&#8221; sendromu ve JavaBeans deseninin eksiklikleri.<\/p>\n<h3>&#8220;Telescoping Constructor&#8221; Sendromu<\/h3>\n<p>Bir nesnenin birden fazla iste\u011fe ba\u011fl\u0131 (optional) parametresi oldu\u011funda, geli\u015ftiriciler genellikle her parametre kombinasyonu i\u00e7in farkl\u0131 bir yap\u0131c\u0131 (constructor) a\u015f\u0131r\u0131 y\u00fcklemesi (overload) tan\u0131mlama yoluna giderler. Bu yakla\u015f\u0131ma &#8220;telescoping constructor&#8221; denir \u00e7\u00fcnk\u00fc constructor&#8217;lar artan say\u0131da parametre ile adeta bir teleskop gibi uzar.<\/p>\n<p>\u00d6rne\u011fin, bir <code>Kullanici<\/code> s\u0131n\u0131f\u0131n\u0131 ele alal\u0131m:<\/p>\n<pre><code class=\"language-java\">\npublic class Kullanici {\n    private String ad;          \/\/ Zorunlu\n    private String soyad;       \/\/ Zorunlu\n    private int yas;            \/\/ \u0130ste\u011fe ba\u011fl\u0131\n    private String telefon;     \/\/ \u0130ste\u011fe ba\u011fl\u0131\n    private String email;       \/\/ \u0130ste\u011fe ba\u011fl\u0131\n    private String adres;       \/\/ \u0130ste\u011fe ba\u011fl\u0131\n\n    \/\/ Zorunlu parametrelerle constructor\n    public Kullanici(String ad, String soyad) {\n        this(ad, soyad, 0, null, null, null);\n    }\n\n    \/\/ Ya\u015f parametresi ile constructor\n    public Kullanici(String ad, String soyad, int yas) {\n        this(ad, soyad, yas, null, null, null);\n    }\n\n    \/\/ Telefon parametresi ile constructor\n    public Kullanici(String ad, String soyad, String telefon) {\n        this(ad, soyad, 0, telefon, null, null);\n    }\n\n    \/\/ Email parametresi ile constructor\n    public Kullanici(String ad, String soyad, String email, boolean isEmail) { \/\/ isEmail hack!\n        this(ad, soyad, 0, null, email, null);\n    }\n\n    \/\/ T\u00fcm parametrelerle constructor\n    public Kullanici(String ad, String soyad, int yas, String telefon, String email, String adres) {\n        this.ad = ad;\n        this.soyad = soyad;\n        this.yas = yas;\n        this.telefon = telefon;\n        this.email = email;\n        this.adres = adres;\n    }\n\n    \/\/ Getter metotlar\u0131...\n}\n<\/code><\/pre>\n<p>Bu \u00f6rnekte g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, sadece birka\u00e7 iste\u011fe ba\u011fl\u0131 parametre bile constructor say\u0131s\u0131n\u0131 ve karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 h\u0131zla art\u0131rmaktad\u0131r. Her yeni iste\u011fe ba\u011fl\u0131 parametre eklendi\u011finde, potansiyel olarak yeni constructor a\u015f\u0131r\u0131 y\u00fcklemeleri tan\u0131mlamak gerekir. Bu durum:<\/p>\n<ul>\n<li><b>Okunabilirli\u011fi Azalt\u0131r:<\/b> \u0130stemci kodu, hangi constructor&#8217;\u0131n hangi parametreleri ald\u0131\u011f\u0131n\u0131 anlamakta zorlanabilir. \u00d6zellikle ayn\u0131 veri tipine sahip parametreler oldu\u011funda (\u00f6rn. iki String parametresi), kar\u0131\u015f\u0131kl\u0131k artar.<\/li>\n<li><b>Hata Yapma Potansiyelini Art\u0131r\u0131r:<\/b> Geli\u015ftiriciler, parametrelerin s\u0131ras\u0131n\u0131 kar\u0131\u015ft\u0131rabilir veya yanl\u0131\u015f constructor&#8217;\u0131 \u00e7a\u011f\u0131rabilir.<\/li>\n<li><b>Bak\u0131m\u0131 Zorla\u015ft\u0131r\u0131r:<\/b> Yeni bir parametre eklemek veya mevcut bir parametrenin veri tipini de\u011fi\u015ftirmek, bir\u00e7ok constructor&#8217;da de\u011fi\u015fiklik yapmay\u0131 gerektirebilir.<\/li>\n<\/ul>\n<h3>JavaBeans Deseni&#8217;nin Eksiklikleri<\/h3>\n<p>&#8220;Telescoping Constructor&#8221; sorununa bir alternatif olarak, JavaBeans deseni bo\u015f bir constructor ve ard\u0131ndan setter metotlar\u0131 kullanarak nesne olu\u015fturmay\u0131 \u00f6nerir:<\/p>\n<pre><code class=\"language-java\">\npublic class Kullanici {\n    private String ad;\n    private String soyad;\n    private int yas;\n    private String telefon;\n    private String email;\n    private String adres;\n\n    public Kullanici() {\n        \/\/ Bo\u015f constructor\n    }\n\n    \/\/ Setter metotlar\u0131\n    public void setAd(String ad) { this.ad = ad; }\n    public void setSoyad(String soyad) { this.soyad = soyad; }\n    public void setYas(int yas) { this.yas = yas; }\n    public void setTelefon(String telefon) { this.telefon = telefon; }\n    public void setEmail(String email) { this.email = email; }\n    public void setAdres(String adres) { this.adres = adres; }\n\n    \/\/ Getter metotlar\u0131...\n}\n<\/code><\/pre>\n<p>\u0130stemci kodu bu deseni \u015f\u00f6yle kullan\u0131r:<\/p>\n<pre><code class=\"language-java\">\nKullanici kullanici = new Kullanici();\nkullanici.setAd(\"Ali\");\nkullanici.setSoyad(\"Y\u0131lmaz\");\nkullanici.setYas(30);\nkullanici.setEmail(\"ali.yilmaz@example.com\");\n\/\/ Di\u011fer alanlar ayarlanmayabilir\n<\/code><\/pre>\n<p>Bu yakla\u015f\u0131m, &#8220;telescoping constructor&#8221; sorununu \u00e7\u00f6zerken, beraberinde ba\u015fka sorunlar getirir:<\/p>\n<ul>\n<li><b>Tutars\u0131z Durum:<\/b> Nesne, t\u00fcm zorunlu parametreleri ayarlanmadan \u00f6nce bile kullan\u0131labilir durumdad\u0131r. Bu, nesnenin ge\u00e7ersiz veya tutars\u0131z bir durumda olmas\u0131na yol a\u00e7abilir. \u00d6rne\u011fin, <code>setAd()<\/code> ve <code>setSoyad()<\/code> \u00e7a\u011fr\u0131lmadan \u00f6nce <code>kullanici<\/code> nesnesi eksiktir.<\/li>\n<li><b>De\u011fi\u015fmezlik (Immutability) Eksikli\u011fi:<\/b> Setter metotlar\u0131 nesneyi de\u011fi\u015ftirilebilir (mutable) yapar. Bu, \u00f6zellikle \u00e7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 (multi-threading) ortamlar\u0131nda g\u00fcvenlik sorunlar\u0131na ve beklenmedik davran\u0131\u015flara yol a\u00e7abilir. Nesne bir kere olu\u015fturulduktan sonra i\u00e7eri\u011finin de\u011fi\u015ftirilmesini engellemek m\u00fcmk\u00fcn de\u011fildir.<\/li>\n<li><b>Atomik Olmayan \u0130n\u015fa:<\/b> Nesne olu\u015fturma i\u015flemi tek bir atomik ad\u0131mda ger\u00e7ekle\u015fmez. Birden fazla setter \u00e7a\u011fr\u0131s\u0131 gerektirdi\u011finden, nesnenin tam olarak ne zaman haz\u0131r oldu\u011fu belirsizle\u015fir.<\/li>\n<\/ul>\n<p>Builder deseni, bu iki yakla\u015f\u0131m\u0131n dezavantajlar\u0131n\u0131 ortadan kald\u0131rarak, karma\u015f\u0131k nesnelerin hem okunabilir hem de g\u00fcvenli bir \u015fekilde olu\u015fturulmas\u0131n\u0131 sa\u011flayan zarif bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h2>Builder Tasar\u0131m Deseni Nedir?<\/h2>\n<p>Builder tasar\u0131m deseni, &#8220;Gang of Four&#8221; (GoF) taraf\u0131ndan tan\u0131mlanan yarat\u0131c\u0131 desenlerden biridir. Temel amac\u0131, karma\u015f\u0131k bir nesnenin yap\u0131m\u0131n\u0131 (construction) onun temsilinden (representation) ay\u0131rmakt\u0131r. Bu sayede, ayn\u0131 yap\u0131m s\u00fcreci kullan\u0131larak farkl\u0131 temsiller (yani farkl\u0131 \u00f6zelliklere sahip nesneler) olu\u015fturulabilir.<\/p>\n<p>\u00d6zetle, Builder deseni, bir nesnenin ad\u0131m ad\u0131m ve esnek bir \u015fekilde olu\u015fturulmas\u0131n\u0131 sa\u011flar. Nesne olu\u015fturma mant\u0131\u011f\u0131n\u0131 ayr\u0131 bir s\u0131n\u0131fa (Builder s\u0131n\u0131f\u0131) ta\u015f\u0131r ve bu s\u0131n\u0131f\u0131n metotlar\u0131 arac\u0131l\u0131\u011f\u0131yla nesnenin par\u00e7alar\u0131 ayarlan\u0131r. Son olarak, bir <code>build()<\/code> metodu \u00e7a\u011fr\u0131larak tam ve tutarl\u0131 bir nesne elde edilir.<\/p>\n<p>Bu desen, \u00f6zellikle a\u015fa\u011f\u0131daki durumlarda faydal\u0131d\u0131r:<\/p>\n<ul>\n<li>Bir nesnenin \u00e7ok say\u0131da parametresi oldu\u011funda (\u00f6zellikle iste\u011fe ba\u011fl\u0131 parametreler).<\/li>\n<li>Nesnenin olu\u015fturulma s\u00fcreci karma\u015f\u0131k oldu\u011funda ve birden fazla ad\u0131m gerektirdi\u011finde.<\/li>\n<li>Ayn\u0131 yap\u0131m s\u00fcreciyle farkl\u0131 konfig\u00fcrasyonlara sahip nesneler olu\u015fturulmas\u0131 gerekti\u011finde.<\/li>\n<li>De\u011fi\u015fmez (immutable) nesneler olu\u015fturmak istendi\u011finde.<\/li>\n<\/ul>\n<h2>Builder Deseni&#8217;nin Temel Bile\u015fenleri<\/h2>\n<p>Builder deseni genellikle d\u00f6rt ana bile\u015fenden olu\u015fur, ancak Java&#8217;daki pratik uygulamalarda baz\u0131lar\u0131 iste\u011fe ba\u011fl\u0131 hale gelebilir:<\/p>\n<h3>\u00dcr\u00fcn (Product)<\/h3>\n<p>\u00dcr\u00fcn, Builder deseni taraf\u0131ndan olu\u015fturulan karma\u015f\u0131k nesnedir. Bu nesne genellikle <code>final<\/code> (de\u011fi\u015fmez) alanlara ve \u00f6zel (private) bir yap\u0131c\u0131ya sahiptir. Bu, nesnenin olu\u015fturulduktan sonra durumunun de\u011fi\u015ftirilememesini ve yaln\u0131zca Builder arac\u0131l\u0131\u011f\u0131yla olu\u015fturulabilmesini sa\u011flar.<\/p>\n<h3>Builder (Soyut\/Aray\u00fcz &#8211; \u0130ste\u011fe Ba\u011fl\u0131)<\/h3>\n<p>Bu bile\u015fen, \u00fcr\u00fcn\u00fcn par\u00e7alar\u0131n\u0131 olu\u015fturmak i\u00e7in bir aray\u00fcz tan\u0131mlar. Genellikle, \u00fcr\u00fcn\u00fcn farkl\u0131 par\u00e7alar\u0131n\u0131 ayarlamak i\u00e7in metotlar i\u00e7erir. Ancak Java&#8217;daki \u00e7o\u011fu Builder deseni uygulamas\u0131nda, soyut bir Builder aray\u00fcz\u00fc yerine do\u011frudan somut Builder s\u0131n\u0131f\u0131 kullan\u0131l\u0131r, \u00f6zellikle tek bir \u00fcr\u00fcn tipi i\u00e7in \u00e7al\u0131\u015f\u0131l\u0131yorsa.<\/p>\n<h3>Somut Builder (Concrete Builder)<\/h3>\n<p>Somut Builder, Builder aray\u00fcz\u00fcn\u00fc (e\u011fer varsa) uygular veya do\u011frudan \u00fcr\u00fcn\u00fcn yap\u0131m\u0131ndan sorumlu s\u0131n\u0131ft\u0131r. \u00dcr\u00fcn\u00fcn par\u00e7alar\u0131n\u0131 olu\u015fturur ve monte eder. Genellikle zincirlenebilir (fluent) metotlar sa\u011flar, b\u00f6ylece birden fazla ayar tek bir sat\u0131rda yap\u0131labilir. Son olarak, <code>build()<\/code> ad\u0131nda bir metot i\u00e7erir ki bu metot, t\u00fcm ayarlamalar yap\u0131ld\u0131ktan sonra nihai \u00fcr\u00fcn nesnesini d\u00f6nd\u00fcr\u00fcr.<\/p>\n<h3>Y\u00f6netici (Director &#8211; \u0130ste\u011fe Ba\u011fl\u0131)<\/h3>\n<p>Y\u00f6netici, Builder aray\u00fcz\u00fcn\u00fc kullanarak bir \u00fcr\u00fcn nesnesi olu\u015fturan s\u0131n\u0131ft\u0131r. Genellikle, belirli bir yap\u0131land\u0131rmaya sahip \u00fcr\u00fcnler olu\u015fturmak i\u00e7in \u00f6nceden tan\u0131mlanm\u0131\u015f ad\u0131mlar\u0131 izler. Ancak \u00e7o\u011fu modern Java uygulamas\u0131nda, istemci kodu do\u011frudan Somut Builder&#8217;\u0131 kullanarak nesneyi olu\u015fturur ve Director s\u0131n\u0131f\u0131na gerek kalmaz. Director, daha \u00e7ok karma\u015f\u0131k, ad\u0131m ad\u0131m ve tekrar eden yap\u0131m s\u00fcre\u00e7leri oldu\u011funda faydal\u0131d\u0131r.<\/p>\n<h2>Builder Deseni&#8217;nin Java&#8217;da Uygulanmas\u0131 (Ad\u0131m Ad\u0131m \u00d6rnek)<\/h2>\n<p>\u015eimdi Builder desenini, daha \u00f6nce bahsetti\u011fimiz <code>Kullanici<\/code> nesnesini olu\u015fturmak i\u00e7in nas\u0131l uygulayaca\u011f\u0131m\u0131za dair ad\u0131m ad\u0131m bir \u00f6rnek inceleyelim.<\/p>\n<h3>Senaryo: Bir Kullan\u0131c\u0131 Nesnesi Olu\u015fturma<\/h3>\n<p>Bir sistemde <code>Kullanici<\/code> nesneleri olu\u015fturmam\u0131z gerekiyor. Bu nesnenin <code>ad<\/code> ve <code>soyad<\/code> gibi zorunlu alanlar\u0131, ayr\u0131ca <code>yas<\/code>, <code>telefon<\/code>, <code>email<\/code> ve <code>adres<\/code> gibi iste\u011fe ba\u011fl\u0131 alanlar\u0131 var. Nesnenin olu\u015fturulduktan sonra de\u011fi\u015fmez olmas\u0131n\u0131 (immutable) ve t\u00fcm zorunlu alanlar\u0131n ayarlanm\u0131\u015f olmas\u0131n\u0131 istiyoruz.<\/p>\n<h3>Kullanici S\u0131n\u0131f\u0131n\u0131n Tan\u0131mlanmas\u0131 (\u00dcr\u00fcn)<\/h3>\n<p>\u00dcr\u00fcn s\u0131n\u0131f\u0131m\u0131z olan <code>Kullanici<\/code>&#8216;y\u0131 a\u015fa\u011f\u0131daki gibi tan\u0131mlayaca\u011f\u0131z:<\/p>\n<pre><code class=\"language-java\">\npublic class Kullanici {\n    private final String ad;\n    private final String soyad;\n    private final int yas;\n    private final String telefon;\n    private final String email;\n    private final String adres;\n    private final boolean aktifMi;\n\n    \/\/ Private constructor - sadece Builder taraf\u0131ndan \u00e7a\u011fr\u0131labilir\n    private Kullanici(Builder builder) {\n        this.ad = builder.ad;\n        this.soyad = builder.soyad;\n        this.yas = builder.yas;\n        this.telefon = builder.telefon;\n        this.email = builder.email;\n        this.adres = builder.adres;\n        this.aktifMi = builder.aktifMi;\n\n        \/\/ Zorunlu alanlar\u0131n kontrol\u00fc\n        if (this.ad == null || this.ad.isEmpty() ||\n            this.soyad == null || this.soyad.isEmpty()) {\n            throw new IllegalArgumentException(\"Ad ve soyad alanlar\u0131 zorunludur.\");\n        }\n    }\n\n    \/\/ Sadece getter metotlar\u0131 (nesneyi de\u011fi\u015fmez yapar)\n    public String getAd() { return ad; }\n    public String getSoyad() { return soyad; }\n    public int getYas() { return yas; }\n    public String getTelefon() { return telefon; }\n    public String getEmail() { return email; }\n    public String getAdres() { return adres; }\n    public boolean isAktifMi() { return aktifMi; }\n\n    @Override\n    public String toString() {\n        return \"Kullanici{\" +\n               \"ad='\" + ad + '\\'' +\n               \", soyad='\" + soyad + '\\'' +\n               \", yas=\" + yas +\n               \", telefon='\" + (telefon != null ? telefon : \"N\/A\") + '\\'' +\n               \", email='\" + (email != null ? email : \"N\/A\") + '\\'' +\n               \", adres='\" + (adres != null ? adres : \"N\/A\") + '\\'' +\n               \", aktifMi=\" + aktifMi +\n               '}';\n    }\n<\/code><\/pre>\n<h3>\u0130\u00e7 \u0130\u00e7e Statik Builder S\u0131n\u0131f\u0131n\u0131n Tan\u0131mlanmas\u0131 (Somut Builder)<\/h3>\n<p>\u015eimdi <code>Kullanici<\/code> s\u0131n\u0131f\u0131n\u0131n i\u00e7ine <code>Builder<\/code> ad\u0131nda i\u00e7 i\u00e7e (nested) ve statik bir s\u0131n\u0131f tan\u0131mlayaca\u011f\u0131z. Bu s\u0131n\u0131f, <code>Kullanici<\/code> nesnesinin olu\u015fturulmas\u0131ndan sorumlu olacak:<\/p>\n<pre><code class=\"language-java\">\n    \/\/ Builder s\u0131n\u0131f\u0131\n    public static class Builder {\n        \/\/ Kullanici s\u0131n\u0131f\u0131n\u0131n alanlar\u0131n\u0131 yans\u0131tan, ancak final olmayan alanlar\n        private String ad;\n        private String soyad;\n        private int yas = 0; \/\/ Varsay\u0131lan de\u011fer\n        private String telefon = null;\n        private String email = null;\n        private String adres = null;\n        private boolean aktifMi = true; \/\/ Varsay\u0131lan de\u011fer\n\n        \/\/ Zorunlu parametreler i\u00e7in constructor\n        public Builder(String ad, String soyad) {\n            this.ad = ad;\n            this.soyad = soyad;\n        }\n\n        \/\/ \u0130ste\u011fe ba\u011fl\u0131 parametreler i\u00e7in zincirlenebilir (fluent) metotlar\n        public Builder yas(int yas) {\n            this.yas = yas;\n            return this; \/\/ Builder nesnesini d\u00f6nd\u00fcrerek zincirleme sa\u011flar\n        }\n\n        public Builder telefon(String telefon) {\n            this.telefon = telefon;\n            return this;\n        }\n\n        public Builder email(String email) {\n            this.email = email;\n            return this;\n        }\n\n        public Builder adres(String adres) {\n            this.adres = adres;\n            return this;\n        }\n\n        public Builder aktifMi(boolean aktifMi) {\n            this.aktifMi = aktifMi;\n            return this;\n        }\n\n        \/\/ Nihai Kullanici nesnesini olu\u015fturan build metodu\n        public Kullanici build() {\n            return new Kullanici(this); \/\/ Builder nesnesini Kullanici constructor'\u0131na iletir\n        }\n    }\n} \/\/ Kullanici s\u0131n\u0131f\u0131n\u0131n sonu\n<\/code><\/pre>\n<h3>Builder Deseni&#8217;nin Kullan\u0131m\u0131 (\u0130stemci Kodu)<\/h3>\n<p>Art\u0131k <code>Kullanici<\/code> nesnelerini Builder deseni kullanarak olu\u015fturabiliriz. \u0130stemci kodu \u00e7ok daha okunabilir ve esnek hale gelir:<\/p>\n<pre><code class=\"language-java\">\npublic class BuilderDeseniUygulama {\n    public static void main(String[] args) {\n        \/\/ Sadece zorunlu alanlarla bir kullan\u0131c\u0131 olu\u015fturma\n        Kullanici kullanici1 = new Kullanici.Builder(\"Ay\u015fe\", \"Demir\").build();\n        System.out.println(kullanici1);\n        \/\/ \u00c7\u0131kt\u0131: Kullanici{ad='Ay\u015fe', soyad='Demir', yas=0, telefon='N\/A', email='N\/A', adres='N\/A', aktifMi=true}\n\n        System.out.println(\"--------------------\");\n\n        \/\/ Baz\u0131 iste\u011fe ba\u011fl\u0131 alanlarla bir kullan\u0131c\u0131 olu\u015fturma\n        Kullanici kullanici2 = new Kullanici.Builder(\"Mehmet\", \"Can\")\n                                        .yas(25)\n                                        .email(\"mehmet.can@example.com\")\n                                        .build();\n        System.out.println(kullanici2);\n        \/\/ \u00c7\u0131kt\u0131: Kullanici{ad='Mehmet', soyad='Can', yas=25, telefon='N\/A', email='mehmet.can@example.com', adres='N\/A', aktifMi=true}\n\n        System.println(\"--------------------\");\n\n        \/\/ T\u00fcm iste\u011fe ba\u011fl\u0131 alanlarla bir kullan\u0131c\u0131 olu\u015fturma\n        Kullanici kullanici3 = new Kullanici.Builder(\"Zeynep\", \"Kara\")\n                                        .yas(35)\n                                        .telefon(\"555-123-4567\")\n                                        .email(\"zeynep.kara@example.com\")\n                                        .adres(\"\u00d6rnek Sokak No: 10\")\n                                        .aktifMi(false)\n                                        .build();\n        System.out.println(kullanici3);\n        \/\/ \u00c7\u0131kt\u0131: Kullanici{ad='Zeynep', soyad='Kara', yas=35, telefon='555-123-4567', email='zeynep.kara@example.com', adres='\u00d6rnek Sokak No: 10', aktifMi=false}\n\n        System.out.println(\"--------------------\");\n\n        \/\/ Hata durumu: Zorunlu alan eksikse\n        try {\n            new Kullanici.Builder(null, \"Hata\").build();\n        } catch (IllegalArgumentException e) {\n            System.out.println(\"Hata yakaland\u0131: \" + e.getMessage());\n        }\n        \/\/ \u00c7\u0131kt\u0131: Hata yakaland\u0131: Ad ve soyad alanlar\u0131 zorunludur.\n    }\n}\n<\/code><\/pre>\n<p>Bu \u00f6rnekte g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, Builder deseni sayesinde nesne olu\u015fturma s\u00fcreci hem son derece okunabilir hale gelmi\u015f hem de karma\u015f\u0131k constructor&#8217;lara veya tutars\u0131z durum riskine gerek kalmam\u0131\u015ft\u0131r. Ayr\u0131ca, <code>Kullanici<\/code> nesnesi olu\u015fturulduktan sonra de\u011fi\u015fmezdir, bu da multi-threading ortamlar\u0131nda g\u00fcvenlik sa\u011flar.<\/p>\n<h2>Builder Deseni&#8217;nin Avantajlar\u0131<\/h2>\n<p>Builder deseni, karma\u015f\u0131k nesne olu\u015fturma s\u00fcre\u00e7lerine getirdi\u011fi yeniliklerle bir\u00e7ok \u00f6nemli avantaj sunar:<\/p>\n<h3>Okunabilirlik ve Anla\u015f\u0131l\u0131rl\u0131k<\/h3>\n<p>Builder metotlar\u0131, ayarlanmakta olan parametrenin amac\u0131n\u0131 a\u00e7\u0131k\u00e7a belirtir (\u00f6rn. <code>yas(25)<\/code> yerine <code>25<\/code>). Bu, \u00f6zellikle ayn\u0131 veri tipine sahip birden fazla parametre oldu\u011funda kodun okunabilirli\u011fini ve anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131r\u0131r. \u0130stemci kodu, neyin ayarland\u0131\u011f\u0131n\u0131 kolayca g\u00f6rebilir.<\/p>\n<h3>De\u011fi\u015fmez Nesneler (Immutability)<\/h3>\n<p>Builder deseni, de\u011fi\u015fmez nesneler olu\u015fturmay\u0131 te\u015fvik eder ve kolayla\u015ft\u0131r\u0131r. \u00dcr\u00fcn s\u0131n\u0131f\u0131n\u0131n alanlar\u0131 <code>final<\/code> olarak tan\u0131mlan\u0131r ve yaln\u0131zca \u00f6zel (private) constructor arac\u0131l\u0131\u011f\u0131yla bir kez ayarlan\u0131r. Bu, nesnenin olu\u015fturulduktan sonra durumunun de\u011fi\u015ftirilememesini garanti eder, bu da multi-threading uygulamalar\u0131nda ve genel kod g\u00fcvenli\u011finde \u00f6nemli bir art\u0131d\u0131r.<\/p>\n<h3>Esneklik<\/h3>\n<p>Farkl\u0131 kombinasyonlarda parametrelerle nesneler olu\u015fturma esnekli\u011fi sunar. \u0130stemci, sadece ihtiyac\u0131 olan metotlar\u0131 \u00e7a\u011f\u0131r\u0131r ve istemedi\u011fi parametreler i\u00e7in varsay\u0131lan de\u011ferler kullan\u0131l\u0131r. Bu, &#8220;telescoping constructor&#8221; yakla\u015f\u0131m\u0131ndaki gibi her kombinasyon i\u00e7in ayr\u0131 constructor tan\u0131mlama ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r.<\/p>\n<h3>&#8220;Telescoping Constructor&#8221; Sendromunu Ortadan Kald\u0131rma<\/h3>\n<p>Builder, \u00e7ok say\u0131da constructor a\u015f\u0131r\u0131 y\u00fcklemesi ihtiyac\u0131n\u0131 ortadan kald\u0131rarak kodun \u015fi\u015fkinli\u011fini azalt\u0131r ve bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r. Yeni bir iste\u011fe ba\u011fl\u0131 parametre eklemek, sadece Builder s\u0131n\u0131f\u0131na yeni bir metot eklemekle \u00e7\u00f6z\u00fcl\u00fcr.<\/p>\n<h3>Tutarl\u0131 Durum<\/h3>\n<p><code>build()<\/code> metodu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, nesne tam ve ge\u00e7erli bir durumda olu\u015fturulur. Zorunlu alanlar <code>build()<\/code> metodu i\u00e7inde veya \u00fcr\u00fcn\u00fcn private constructor&#8217;\u0131nda do\u011frulanabilir. Bu, JavaBeans desenindeki gibi nesnenin eksik veya tutars\u0131z bir durumda kullan\u0131lma riskini ortadan kald\u0131r\u0131r.<\/p>\n<h3>Sorumluluklar\u0131n Ayr\u0131lmas\u0131<\/h3>\n<p>Nesne olu\u015fturma mant\u0131\u011f\u0131 (Builder s\u0131n\u0131f\u0131), nesnenin kendi i\u015f mant\u0131\u011f\u0131ndan (\u00dcr\u00fcn s\u0131n\u0131f\u0131) ayr\u0131l\u0131r. Bu, tek sorumluluk prensibine (Single Responsibility Principle) uygun bir tasar\u0131md\u0131r ve kodun daha mod\u00fcler olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Builder Deseni&#8217;nin Dezavantajlar\u0131<\/h2>\n<p>Her tasar\u0131m deseni gibi, Builder deseninin de baz\u0131 dezavantajlar\u0131 vard\u0131r:<\/p>\n<h3>Artan Kod Karma\u015f\u0131kl\u0131\u011f\u0131<\/h3>\n<p>Her karma\u015f\u0131k nesne i\u00e7in ek bir Builder s\u0131n\u0131f\u0131 yazmak gerekir. Bu, \u00f6zellikle k\u00fc\u00e7\u00fck ve basit nesneler i\u00e7in gereksiz kod \u015fi\u015fkinli\u011fine yol a\u00e7abilir. Projede \u00e7ok say\u0131da s\u0131n\u0131f varsa, bu durum dosya say\u0131s\u0131n\u0131 ve genel kod hacmini art\u0131rabilir.<\/p>\n<h3>Basit Nesneler \u0130\u00e7in Gereksiz<\/h3>\n<p>E\u011fer bir nesnenin yaln\u0131zca birka\u00e7 zorunlu veya iste\u011fe ba\u011fl\u0131 parametresi varsa, Builder deseni kullanmak a\u015f\u0131r\u0131ya ka\u00e7abilir. Bu t\u00fcr durumlarda, do\u011frudan bir constructor veya basit bir fabrika metodu daha uygun olabilir.<\/p>\n<h3>Ek Bellek Kullan\u0131m\u0131<\/h3>\n<p>Builder nesnesinin kendisi de bellek kaplar. Her nesne olu\u015fturma i\u015fleminde bir Builder nesnesi \u00f6rne\u011fi olu\u015fturulur. B\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda veya \u00e7ok s\u0131k nesne olu\u015fturma durumlar\u0131nda bu durum k\u00fc\u00e7\u00fck bir performans veya bellek maliyeti yaratabilir, ancak \u00e7o\u011fu modern uygulamada bu ihmal edilebilir bir maliyettir.<\/p>\n<h2>Builder Deseni Ne Zaman Kullan\u0131lmal\u0131?<\/h2>\n<p>Builder deseni, belirli senaryolarda son derece faydal\u0131d\u0131r. A\u015fa\u011f\u0131daki durumlarda Builder desenini kullanmay\u0131 d\u00fc\u015f\u00fcnmelisiniz:<\/p>\n<ul>\n<li><b>\u00c7ok Say\u0131da \u0130ste\u011fe Ba\u011fl\u0131 Parametre:<\/b> Bir nesnenin \u00fc\u00e7ten fazla iste\u011fe ba\u011fl\u0131 parametresi oldu\u011funda, &#8220;telescoping constructor&#8221; sendromundan ka\u00e7\u0131nmak i\u00e7in Builder deseni g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/li>\n<li><b>Karma\u015f\u0131k ve \u00c7ok Ad\u0131ml\u0131 \u0130n\u015fa S\u00fcreci:<\/b> Nesne olu\u015fturma s\u00fcreci karma\u015f\u0131k ad\u0131mlar, ko\u015fullu mant\u0131k veya farkl\u0131 bile\u015fenlerin montaj\u0131n\u0131 gerektirdi\u011finde Builder, bu s\u00fcreci y\u00f6netmek i\u00e7in idealdir.<\/li>\n<li><b>Farkl\u0131 Nesne Temsilleri:<\/b> Ayn\u0131 yap\u0131m s\u00fcreciyle, ancak farkl\u0131 \u00f6zellik setlerine sahip nesneler olu\u015fturman\u0131z gerekti\u011finde. \u00d6rne\u011fin, bir <code>Rapor<\/code> nesnesinin farkl\u0131 formatlarda (PDF, CSV, HTML) \u00e7\u0131kt\u0131lar\u0131n\u0131n ayn\u0131 Builder taraf\u0131ndan olu\u015fturulabilmesi.<\/li>\n<li><b>De\u011fi\u015fmez Nesneler Gereklili\u011fi:<\/b> Uygulaman\u0131zda de\u011fi\u015fmez nesnelerin (immutable objects) kullan\u0131m\u0131 bir gereklilik veya en iyi uygulama oldu\u011funda. Builder deseni, nesnenin durumunun olu\u015fturulduktan sonra de\u011fi\u015fmemesini garanti eder.<\/li>\n<li><b>Daha \u0130yi Okunabilirlik ve G\u00fcvenlik:<\/b> \u0130stemci kodunun daha okunabilir olmas\u0131n\u0131 sa\u011flamak ve nesnelerin tutars\u0131z bir durumda olu\u015fturulmas\u0131n\u0131 engellemek istedi\u011finizde.<\/li>\n<\/ul>\n<h2>Varyasyonlar ve En \u0130yi Uygulamalar<\/h2>\n<p>Builder deseninin temel yap\u0131s\u0131 esnektir ve baz\u0131 varyasyonlar veya ek \u00f6zelliklerle daha da geli\u015ftirilebilir:<\/p>\n<h3>Fluent API Tasar\u0131m\u0131<\/h3>\n<p>Builder metotlar\u0131n\u0131n, her \u00e7a\u011fr\u0131dan sonra <code>this<\/code> (yani Builder nesnesinin kendisini) d\u00f6nd\u00fcrmesi, &#8220;fluent API&#8221; veya &#8220;method chaining&#8221; olarak bilinen bir stil olu\u015fturur. Bu, istemci kodunun daha ak\u0131c\u0131 ve okunabilir olmas\u0131n\u0131 sa\u011flar (\u00f6rn. <code>builder.yas(25).email(\"...\").build()<\/code>). Bu, Builder deseninin en yayg\u0131n ve \u00f6nerilen uygulamalar\u0131ndan biridir.<\/p>\n<h3>Do\u011frulama (Validation)<\/h3>\n<p>Parametrelerin ge\u00e7erlili\u011fini kontrol etmek i\u00e7in <code>build()<\/code> metodu i\u00e7inde do\u011frulama mant\u0131\u011f\u0131 eklenebilir. \u00d6rne\u011fin, zorunlu alanlar\u0131n bo\u015f olup olmad\u0131\u011f\u0131n\u0131 kontrol edebilir veya say\u0131sal de\u011ferlerin belirli bir aral\u0131kta olup olmad\u0131\u011f\u0131n\u0131 do\u011frulayabilirsiniz. Ge\u00e7ersiz parametreler durumunda <code>IllegalArgumentException<\/code> gibi bir istisna f\u0131rlat\u0131labilir.<\/p>\n<h3>Lombok&#8217;un <code>@Builder<\/code> Anotasyonu<\/h3>\n<p>Modern Java projelerinde, <a href=\"https:\/\/projectlombok.org\/\">Project Lombok<\/a> k\u00fct\u00fcphanesi, Builder desenini otomatik olarak olu\u015fturmak i\u00e7in <code>@Builder<\/code> anotasyonunu sunar. Bu, boilerplate kodu yazma ihtiyac\u0131n\u0131 ortadan kald\u0131rarak geli\u015ftirme s\u00fcrecini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r.<\/p>\n<pre><code class=\"language-java\">\nimport lombok.Builder;\nimport lombok.Getter;\nimport lombok.ToString;\n\n@Builder\n@Getter\n@ToString\npublic class KullaniciLombok {\n    private final String ad;\n    private final String soyad;\n    private final int yas;\n    private final String telefon;\n    private final String email;\n    private final String adres;\n    private final boolean aktifMi;\n\n    \/\/ Lombok otomatik olarak bir Builder s\u0131n\u0131f\u0131 ve private constructor olu\u015fturur.\n    \/\/ Kullan\u0131m\u0131:\n    \/\/ KullaniciLombok kullanici = KullaniciLombok.builder()\n    \/\/                                         .ad(\"Elif\")\n    \/\/                                         .soyad(\"Ak\")\n    \/\/                                         .yas(28)\n    \/\/                                         .build();\n}\n<\/code><\/pre>\n<p>Lombok, geli\u015ftiricilerin Builder deseninin t\u00fcm avantajlar\u0131ndan, ek kod yazma y\u00fck\u00fc olmadan faydalanmas\u0131n\u0131 sa\u011flar. Bu, \u00f6zellikle b\u00fcy\u00fck projelerde zaman ve \u00e7aba tasarrufu a\u00e7\u0131s\u0131ndan \u00e7ok de\u011ferlidir.<\/p>\n<h2>Di\u011fer Yarat\u0131c\u0131 Desenlerle Kar\u015f\u0131la\u015ft\u0131rma<\/h2>\n<p>Builder deseni, di\u011fer yarat\u0131c\u0131 desenlerle benzerlikler ve farkl\u0131l\u0131klar g\u00f6sterir. Do\u011fru deseni se\u00e7mek i\u00e7in bu farklar\u0131 anlamak \u00f6nemlidir:<\/p>\n<h3>Builder vs. Factory Method<\/h3>\n<ul>\n<li><b>Factory Method:<\/b> Hangi nesnenin olu\u015fturulaca\u011f\u0131na odaklan\u0131r. Genellikle, bir aray\u00fcz\u00fc uygulayan farkl\u0131 somut s\u0131n\u0131flardan birini d\u00f6nd\u00fcr\u00fcr. \u0130stemci, belirli bir t\u00fcr nesne ister, ancak nas\u0131l olu\u015fturuldu\u011funu bilmez.<\/li>\n<li><b>Builder:<\/b> Karma\u015f\u0131k bir nesnenin <em>nas\u0131l<\/em> olu\u015fturulaca\u011f\u0131na odaklan\u0131r. Tek bir karma\u015f\u0131k nesnenin ad\u0131m ad\u0131m ve esnek bir \u015fekilde yap\u0131land\u0131r\u0131lmas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<h3>Builder vs. Abstract Factory<\/h3>\n<ul>\n<li><b>Abstract Factory:<\/b> \u0130li\u015fkili nesne aileleri olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir UI Factory, hem Windows d\u00fc\u011fmeleri hem de Mac d\u00fc\u011fmeleri \u00fcretebilir.<\/li>\n<li><b>Builder:<\/b> Tek bir karma\u015f\u0131k nesnenin ad\u0131m ad\u0131m ve esnek bir \u015fekilde olu\u015fturulmas\u0131yla ilgilenir. Farkl\u0131 Builder&#8217;lar ayn\u0131 \u00fcr\u00fcn tipinin farkl\u0131 temsillerini olu\u015fturabilir, ancak Abstract Factory gibi birbiriyle ili\u015fkili nesne aileleri \u00fcretmez.<\/li>\n<\/ul>\n<h3>Builder vs. Prototype<\/h3>\n<ul>\n<li><b>Prototype:<\/b> Mevcut bir nesneyi kopyalayarak (cloning) yeni nesneler olu\u015fturur. \u00d6zellikle, nesne olu\u015fturman\u0131n maliyetli oldu\u011fu durumlarda veya mevcut bir nesnenin durumunu temel alarak yeni bir nesneye ihtiya\u00e7 duyuldu\u011funda kullan\u0131l\u0131r.<\/li>\n<li><b>Builder:<\/b> Bir nesneyi s\u0131f\u0131rdan, ad\u0131m ad\u0131m in\u015fa eder. Klonlama yerine, parametreleri ba\u015ftan ayarlayarak yeni bir nesne olu\u015fturur.<\/li>\n<\/ul>\n<h2>Sonu\u00e7<\/h2>\n<p>Builder tasar\u0131m deseni, Java&#8217;da karma\u015f\u0131k nesne olu\u015fturma problemlerine zarif ve etkili bir \u00e7\u00f6z\u00fcm sunar. &#8220;Telescoping Constructor&#8221; sendromu ve JavaBeans deseninin eksiklikleri gibi yayg\u0131n sorunlar\u0131 ortadan kald\u0131rarak, kodun okunabilirli\u011fini, s\u00fcrd\u00fcr\u00fclebilirli\u011fini ve g\u00fcvenli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. De\u011fi\u015fmez (immutable) nesnelerin olu\u015fturulmas\u0131n\u0131 kolayla\u015ft\u0131rmas\u0131, \u00f6zellikle modern, \u00e7ok i\u015f par\u00e7ac\u0131kl\u0131 uygulamalarda Builder desenini vazge\u00e7ilmez k\u0131lar.<\/p>\n<p>Her ne kadar basit nesneler i\u00e7in gereksiz bir karma\u015f\u0131kl\u0131k getirse de, \u00e7ok say\u0131da iste\u011fe ba\u011fl\u0131 parametreye sahip veya karma\u015f\u0131k bir in\u015faa s\u00fcrecine sahip nesneler i\u00e7in Builder deseni, geli\u015ftiricilere b\u00fcy\u00fck esneklik ve kontrol sa\u011flar. Lombok gibi k\u00fct\u00fcphanelerin <code>@Builder<\/code> anotasyonu sayesinde, bu desenin avantajlar\u0131ndan minimum boilerplate koduyla faydalanmak da art\u0131k \u00e7ok daha kolayd\u0131r.<\/p>\n<p>Sonu\u00e7 olarak, Builder deseni, Java geli\u015ftiricilerinin ara\u00e7 kutusunda bulunmas\u0131 gereken temel bir ara\u00e7t\u0131r. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, daha temiz, daha g\u00fcvenli ve daha esnek kod yaz\u0131lmas\u0131na olanak tan\u0131r, bu da uzun vadede yaz\u0131l\u0131m projelerinin ba\u015far\u0131s\u0131na katk\u0131da bulunur.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Java&#8217;da Builder Tasar\u0131m Deseni: Karma\u015f\u0131k Nesnelerin \u0130n\u015fas\u0131n\u0131 Y\u00f6netmek\nYaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, kar\u015f\u0131la\u015f\u0131lan ortak sorunlara za","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1408],"tags":[],"class_list":{"0":"post-36312","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-java","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Java&#039;da Builder Tasar\u0131m Deseni: Karma\u015f\u0131k Nesnelerin \u0130n\u015fas\u0131n\u0131 Y\u00f6netmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java&#039;da Builder Tasar\u0131m Deseni: Karma\u015f\u0131k Nesnelerin \u0130n\u015fas\u0131n\u0131 Y\u00f6netmek\" \/>\n<meta property=\"og:description\" content=\"Java&#039;da Builder Tasar\u0131m Deseni: Karma\u015f\u0131k Nesnelerin \u0130n\u015fas\u0131n\u0131 Y\u00f6netmek Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, kar\u015f\u0131la\u015f\u0131lan ortak sorunlara za\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-13T10:40:53+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Java&#8217;da Builder Tasar\u0131m Deseni: Karma\u015f\u0131k Nesnelerin \u0130n\u015fas\u0131n\u0131 Y\u00f6netmek\",\"datePublished\":\"2025-12-13T10:40:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/\"},\"wordCount\":2668,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Java\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/\",\"name\":\"Java'da Builder Tasar\u0131m Deseni: Karma\u015f\u0131k Nesnelerin \u0130n\u015fas\u0131n\u0131 Y\u00f6netmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-13T10:40:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java&#8217;da Builder Tasar\u0131m Deseni: Karma\u015f\u0131k Nesnelerin \u0130n\u015fas\u0131n\u0131 Y\u00f6netmek\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Java'da Builder Tasar\u0131m Deseni: Karma\u015f\u0131k Nesnelerin \u0130n\u015fas\u0131n\u0131 Y\u00f6netmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/","og_locale":"tr_TR","og_type":"article","og_title":"Java'da Builder Tasar\u0131m Deseni: Karma\u015f\u0131k Nesnelerin \u0130n\u015fas\u0131n\u0131 Y\u00f6netmek","og_description":"Java'da Builder Tasar\u0131m Deseni: Karma\u015f\u0131k Nesnelerin \u0130n\u015fas\u0131n\u0131 Y\u00f6netmek Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, kar\u015f\u0131la\u015f\u0131lan ortak sorunlara za","og_url":"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-13T10:40:53+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Java&#8217;da Builder Tasar\u0131m Deseni: Karma\u015f\u0131k Nesnelerin \u0130n\u015fas\u0131n\u0131 Y\u00f6netmek","datePublished":"2025-12-13T10:40:53+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/"},"wordCount":2668,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Java"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/","url":"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/","name":"Java'da Builder Tasar\u0131m Deseni: Karma\u015f\u0131k Nesnelerin \u0130n\u015fas\u0131n\u0131 Y\u00f6netmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-13T10:40:53+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/javada-builder-tasarim-deseni-karmasik-nesnelerin-insasini-yonetmek\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java&#8217;da Builder Tasar\u0131m Deseni: Karma\u015f\u0131k Nesnelerin \u0130n\u015fas\u0131n\u0131 Y\u00f6netmek"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36312","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36312"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36312\/revisions"}],"predecessor-version":[{"id":36313,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36312\/revisions\/36313"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36312"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36312"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36312"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}