![translation](https://cdn.durumis.com/common/trans.png)
यह एक AI अनुवादित पोस्ट है।
भाषा चुनें
durumis AI द्वारा संक्षेपित पाठ
- जब बहुत सारे पैरामीटर होते हैं, तो बिल्डर पैटर्न कन्स्ट्रक्टर या स्टेटिक फैक्ट्री का उपयोग करने से अधिक उपयोगी होता है, और बिल्डर पैटर्न में चरणबद्ध कन्स्ट्रक्टर पैटर्न की स्थिरता और जावा बीन्स पैटर्न की पठनीयता होती है।
- बिल्डर पैटर्न आवश्यक पैरामीटर के साथ एक कन्स्ट्रक्टर को कॉल करके एक बिल्डर ऑब्जेक्ट प्राप्त करता है, फिर बिल्डर ऑब्जेक्ट द्वारा प्रदान किए गए सेटर मेथड का उपयोग करके वांछित वैकल्पिक पैरामीटर सेट करता है, और अंत में आवश्यक ऑब्जेक्ट प्राप्त करने के लिए build() मेथड को कॉल करता है।
- बिल्डर पैटर्न का उपयोग करके कोड को लिखना और पढ़ना आसान होता है, लेकिन इसमें बिल्डर ऑब्जेक्ट बनाने और कोड को अधिक विस्तृत बनाने का नुकसान है।
क्रमबद्ध निर्माता पैटर्न
स्थिर कारखाने और निर्माताओं को कई पैरामीटर होने पर पर्याप्त रूप से प्रतिक्रिया देना मुश्किल होता है। उदाहरण के लिए, यदि क्लास में 6 फ़ील्ड हैं और आप 2 पैरामीटर, 3 पैरामीटर, ... के साथ निर्माता को विभाजित करना चाहते हैं, तो आप नीचे दिए गए क्रमबद्ध निर्माता पैटर्न का उपयोग कर सकते हैं।
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) {
this.servingSize = servingSize;
this.servings = servings;
this.calories = calories;
this.fat = fat;
this.sodium = sodium;
this.carbohydrate = carbohydrate;
}
public NutritionFacts(int servingSize, int servings) {
this(servingSize, servings, 0, 0, 0, 0);
}
public NutritionFacts(int servingSize, int servings, int calories) {
this(servingSize, servings, calories, 0, 0, 0);
}
public NutritionFacts(int servingSize, int servings, int calories, int fat) {
this(servingSize, servings, calories, fat, 0, 0);
}
public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium) {
this(servingSize, servings, calories, fat, sodium, 0);
}
हालांकि, इससे भी, यदि बहुत अधिक पैरामीटर हैं, तो कोड पढ़ते समय प्रत्येक मान का अर्थ भ्रमित हो सकता है, और समान प्रकार के पैरामीटर को भ्रमित करके मान डाले जा सकते हैं।
जावा बीन्स पैटर्न
जावा बीन्स पैटर्न एक ऑब्जेक्ट को पैरामीटर रहित निर्माता के साथ बनाता है और फिर सेटर मेथड्स को कॉल करके वांछित पैरामीटर मानों को सेट करता है।
public class NutritionFactsWithJavaBeansPattern {
private int servingSize = -1; // अनिवार्य. डिफ़ॉल्ट मान नहीं।
private int servings = -1; // अनिवार्य. डिफ़ॉल्ट मान नहीं।
private int calories;
private int fat;
private int sodium;
private int carbohydrate;
public void setServingSize(int servingSize) {
this.servingSize = servingSize;
}
public void setServings(int servings) {
this.servings = servings;
}
public void setCalories(int calories) {
this.calories = calories;
}
public void setFat(int fat) {
this.fat = fat;
}
public void setSodium(int sodium) {
this.sodium = sodium;
}
public void setCarbohydrate(int carbohydrate) {
this.carbohydrate = carbohydrate;
}
जावा बीन्स पैटर्न कई पैरामीटर होने पर भी इंस्टेंस को बिना किसी भ्रम के बनाने की अनुमति देता है। हालांकि, एक ऑब्जेक्ट बनाने के लिए कई सेटर मेथड्स को कॉल करना पड़ता है, और ऑब्जेक्ट पूरी तरह से पूरा होने तक संगति बिगड़ जाती है। इस कारण से, क्लास को अपरिवर्तनीय नहीं बनाया जा सकता है।
बिल्डर पैटर्न
क्रमबद्ध निर्माता पैटर्न की स्थिरता और जावा बीन्स पैटर्न की पठनीयता को मिलाकर बिल्डर पैटर्न का उपयोग मुख्य रूप से किया जाता है।
क्लाइंट सीधे ऑब्जेक्ट बनाने के बजाय, बिल्डर ऑब्जेक्ट प्राप्त करने के लिए केवल आवश्यक पैरामीटर के साथ निर्माता को कॉल करता है। फिर, बिल्डर ऑब्जेक्ट द्वारा प्रदान किए गए एक प्रकार के सेटर मेथड्स का उपयोग करके, वह वांछित वैकल्पिक पैरामीटर सेट करता है। अंत में, वह आवश्यक ऑब्जेक्ट प्राप्त करने के लिए पैरामीटर रहित build() मेथड को कॉल करता है।
public class NutritionFactsWithBuilderPattern {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
private NutritionFactsWithBuilderPattern(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
public static class Builder {
private final int servingSize;
private final int servings;
private int calories;
private int fat;
private int sodium;
private int carbohydrate;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val) {
calories = val;
return this;
}
public Builder fat(int val) {
fat = val;
return this;
}
public Builder sodium(int val) {
sodium = val;
return this;
}
public Builder carbohydrate(int val) {
calories = val;
return this;
}
public NutritionFactsWithBuilderPattern build() {
return new NutritionFactsWithBuilderPattern(this);
}
}
बिल्डर क्लास के अंदर निर्माता केवल आवश्यक पैरामीटर लेता है, और शेष वैकल्पिक पैरामीटर एक प्रकार के सेटर मेथड्स का उपयोग करके भरे जाते हैं। और अंत में, build() मेथड के माध्यम से, पूर्ण NutritionFactsWithBuilderPattern ऑब्जेक्ट बनाया जाता है। NutritionFactsWithBuilderPattern क्लास अपरिवर्तनीय है, और बिल्डर के सेटर मेथड्स बिल्डर को खुद वापस करते हैं, जिससे उन्हें श्रृंखलाबद्ध रूप से बुलाया जा सकता है। इस तरह के तरीके को फ्लुएंट एपीआई या मेथड चेनिंग कहा जाता है।
NutritionFactsWithBuilderPattern nutritionFacts =
new NutritionFactsWithBuilderPattern.Builder(240, 8)
.calories(100)
.sodium(35)
क्लाइंट की दृष्टि से, बिल्डर पैटर्न कोड लिखना और पढ़ना आसान बनाता है।
श्रेणीबद्ध रूप से डिज़ाइन की गई कक्षाओं के साथ अच्छी तरह से काम करने वाला बिल्डर पैटर्न
public abstract class Pizza {
public enum Topping {
HAM, MUSHROOM, ONION, PEPPER, SAUSAGE
}
final Set toppings;
Pizza(Builder> builder) {
toppings = builder.toppings.clone();
}
abstract static class Builder> {
private EnumSet toppings = EnumSet.noneOf(Topping.class);
public T addTopping(Topping topping) {
toppings.add(topping);
return self();
}
abstract Pizza build();
protected abstract T self();
}
Pizza.Builder क्लास पुनरावर्ती प्रकार सीमा का उपयोग करने वाला जेनेरिक प्रकार है, और self() नामक एक सार मेथड के साथ, सबक्लास बिना कास्टिंग के मेथड चेनिंग का समर्थन कर सकते हैं। सबक्लास में, इस सार मेथड के वापसी मान को स्वयं को दिया जाना चाहिए।
अब न्यूयॉर्क पिज्जा और कैलजोन पिज्जा जैसे पिज्जा के सबक्लास को देखते हुए, बिल्डर पैटर्न के लचीलेपन का अनुभव करें।
public class NyPizza extends Pizza {
public enum Size {
SMALL, MEDIUM, LARGE
}
private final Size size; // आवश्यक पैरामीटर
private NyPizza(Builder builder) {
super(builder);
size = builder.size;
}
public static class Builder extends Pizza.Builder {
private final Size size;
public Builder(Size size) {
this.size = size;
}
@Override
NyPizza build() {
return new NyPizza(this);
}
@Override
protected Builder self() {
return this;
}
}
}
public class CalzonePizza extends Pizza {
private final boolean sauceInside; // वैकल्पिक पैरामीटर
private CalzonePizza(Builder builder) {
super(builder);
sauceInside = builder.sauceInside;
}
public static class Builder extends Pizza.Builder {
private boolean sauceInside = false;
public Builder sauceInside() {
sauceInside = true;
return this;
}
@Override
CalzonePizza build() {
return new CalzonePizza(this);
}
@Override
protected Builder self() {
return this;
}
}
प्रत्येक सबक्लास के बिल्डर द्वारा परिभाषित build() क्लास विशिष्ट सबक्लास को वापस करता है। सुपरक्लास के मेथड द्वारा वापस किए गए प्रकार के बजाय, सबक्लास के मेथड द्वारा वापस किया गया प्रकार उसका सबटाइप होता है, जिसे कोवैरिएंट रिटर्न टाइपिंग कहा जाता है। इस सुविधा का उपयोग करके, क्लाइंट को कास्ट करने की आवश्यकता नहीं है।
NyPizza nyPizza = new NyPizza.Builder(Size.SMALL)
.addTopping(Topping.SAUSAGE)
.addTopping(Topping.ONION)
.build();
CalzonePizza calzonePizza = new CalzonePizza.Builder()
.addTopping(Topping.HAM)
.sauceInside()
क्लाइंट की दृष्टि से, पिज्जा के एनम और प्रत्येक सबक्लास के एनम को मिलाकर इस्तेमाल किया जा सकता है, और प्रत्येक के लिए उपयुक्त मेथड का उपयोग करके ऑब्जेक्ट को पूरा किया जा सकता है।
बिल्डर पैटर्न के नुकसान
- बिल्डर ऑब्जेक्ट बनाना आवश्यक है।
- कोड लंबा है।
सारांश
यदि निर्माता या स्थिर फैक्टरी मेथड को कई पैरामीटर संभालने की आवश्यकता है, तो बिल्डर पैटर्न पर विचार करें।
स्रोत
- प्रभावी जावा