2016-09-07 63 views
5

Nesne yapılandırmasına erişmek için neden oluşturucu nesnesini yeniden kullanmamalıyım? Örneğin :Bir Oluşturucu Kalıbı kullanırken, neden nesne yapılandırmasına erişmek için oluşturucu nesnesini yeniden kullanmamalıyım? <a href="https://en.wikipedia.org/wiki/Builder_pattern">Builder Pattern</a> kullanırken

Normal yol:

ObjectA(ObjectBuilder b) { 
    this.a = b.getA(); 
} 
public Object getA(){ 
    return this.a; 
} 

Ama neden sadece bu kullanamazsınız:

ObjectA(ObjectBuilder b) { 
    this.builder = b; 
} 
public Object getA(){ 
    return this.builder.getA(); 
} 

Teşekkür :)

+6

Oluşturucunun kullanılmasıyla ilgili tüm nokta, değişmez nesneler oluşturmaktır: Oluşturucu, değiştirilemez, oluşturduğu şey değildir. Oluşturucuya delege verirseniz, örneğiniz tekrar değiştirilebilir: "ObjectBuilder" in aynı örneğine başvuran herhangi biri, "ObjectA" nızı değiştirebilir. Eğer değişken bir nesne istiyorsanız, kurucuya gerek yoktur: sadece 'ObjectA'nızda ayarlayıcılar var. –

+0

Bu oldukça iyi bir cevap. Yapımcıdan sonra A'nın değiştirilmesini istemediğim doğru. Bu yüzden ilk olarak inşaatçıyı kullandım. –

cevap

7

bir inşaatçı kullanmak için büyük bir nedendir immutable bir nesne oluşturmak için: yapıcı değişebilir, inşa ettiği şey (zorunlu olarak) değildir.

Oluşturucuya delege verirseniz, örneğiniz tekrar değiştirilebilir: ObjectBuilder aynı örneğine başvuru yapan herhangi biri, ObjectA öğenizi değiştirebilir. Bu, yapım süresinde ObjectA durumunun geçerliliği konusunda yaptığınız tüm kontrollerin geçersiz kılınabileceği anlamına gelir.

Değiştirilebilir bir nesne istiyorsanız, oluşturucuya gerek yoktur: sadece ObjectA ürününüzde ayarlayıcılar var.

+2

Değiştirilebilir bir nesne istiyorsanız, oluşturucu için _less_ ihtiyacı vardır. Yapıcılar sadece değişmezlikten daha iyidir. – jaco0646

+0

@AndyTurner Builder modelinde benzer bir soru var [burada] (http://stackoverflow.com/questions/41206286/how-to-clone-old-builder-to-make-a-new-builder-object). Orada bana yardım edip edemeyeceğini görmek istedim. –