2013-10-02 24 views
5

vs içinde sınıf dışındaki kurucu örneğini kullanma arasındaki avantajları nelerdir?Builder Modeli dış sınıfa karşı mı?

İç sınıfı:

public class Person { 
    private String name; 
    private String eyeColor; 
    private String hairColor; 

    public Person setName(String name) { 
     this.name = name; 
     return this; 
    } 

    public Person setEyeColor(String eyeColor) { 
     this.eyeColor = eyeColor; 
     return this; 
    } 

    public Person setHairColor(String hairColor) { 
     this.hairColor = hairColor; 
     return this; 
    } 
} 

// Example usage: 
Person p = new Person() 
       .setName("Bob") 
       .setHairColor("Black") 
       .setEyeColor("Brown") 

Dış sınıfı: Duruma göre

public class Person { 
    private String name; 
    private String eyeColor; 
    private String hairColor; 

    public Person(String name, String eyeColor, String hairColor) { 
     this.name = name; 
     this.eyeColor = eyeColor; 
     this.hairColor = hairColor; 
    } 
} 

public class PersonBuilder { 
    private String name; 
    private String eyeColor; 
    private String hairColor; 

    public Person build() { 
     return new Person(name, eyeColor, hairColor); 
    } 

    public PersonBuilder with(String name) { 
     this.name = name; 
     return this; 
    } 

    public PersonBuilder setEyeColor(String eyeColor) { 
     this.eyeColor = eyeColor; 
     return this; 
    } 

    public PersonBuilder setHairColor(String hairColor) { 
     this.hairColor = hairColor; 
     return this; 
    } 
} 

// Example usage: 
Person p = new PersonBuilder() 
       .setName("Bob") 
       .setHairColor("Black") 
       .setEyeColor("Brown") 
       .build(); 
+0

Bu görüş temelli olduğunu ... Ama içimde olan dağınıklığı düşürür düşünüyorum. MyClass.Builder, MyClass2.Builder, vb - olabilir ve MyClassBuilder, MyClass2Builder, vb sınıfları bir sürü yok – ppeterka

+0

Basit şeyler için gerçekten önemli değil, ancak bazı diğer için setter dönüş türlerini kullanmak isteyebilirsiniz gösterge (karmaşık ayarlayıcılarda), bu durumda harici olan daha fazla esneklik sunacaktır. Şahsen ben dış olanı ile gideceğim. sınıf inşa tarafından özel olarak kullanılmak üzere tasarlanmıştır, çünkü – Thihara

+0

IMHO, Oluşturucu bir iç sınıfı olmalıdır. Bundan dolayı, onu normal bir sınıf haline getirmek için gerçek bir fayda yoktur. – hfontanez

cevap

7

.

Sıklıkla Builder ve Factory desenlerini birleştiririm, bu nedenle "yerleşik" nesne birçok uygulamadan biri olabileceğinden Oluşturucuyu bir dış sınıf olarak algılamanın mantıklı olmasını sağlar. Bunun, uygulamaların, paketin özel veya hatta özel iç sınıfları olmasını sağlayan ek bir yararı vardır.

sadece daha niyet açıklayıcı ya gerçekten kişisel tercihi daha az karmaşık bir kamu sınıfın yapıcı hale getirmek için Builder kullanıyorsanız. Biri, kullanıcılara kafa karıştırıcı olabilecek API'da ek bir sınıfa sahip olmanın avantajlarını ve eksilerini tartabilir.

Ancak, ben seçeneklerden birini seçmek ve API boyunca bu kurallara uymanızı öneririz. Tüm Yapıcılar ya iç sınıflar ya da dış sınıflar ise, genel sistem mimarisini daha kolay anlar; onları karıştırmayın.

böyle iç ve dış Üreticileri karıştırmayın:

Foo foo = new Foo.Builder(...) 

Bar bar = new BarBuilder(...) 
1

2 uygulama size bitmiş bir nesneyi almak ve böylece yapacağız sizi temin daha güvenilir uygulama ilk yersiz e kadar u ise Tüm alanları ayarlamayı bitir. Genel olarak

Eğer unstated nesne kullanıma hazır olmak istemiyorum.