Builder Pattern
- Sree Hari
- Apr 16, 2017
- 4 min read
Builder design pattern, creational design patterns வகையை சார்ந்தவை. இங்கே, creation எனப்படுவது வேறு ஒன்றும் அல்ல usual object creation தான். Java-வில் object create பண்ண ஒரே வழி, new operator!
Object obj = new Object ();
இதிலென்ன design pattern வேண்டிக்கிடக்கிறது?!

உங்களை போல KFC chicken, எனக்கும் பிடிக்கும். புதியதாக Mingles Bucket என்று ஒரு item introduce செய்திருக்கிறார்கள். Spicy Chicken, Smoky Chicken, Burger, drinks, topups என customer விருப்பப்படி என்ன வேண்டுமோ அதை select செய்து Mingles Bucket ஆக்கிவிடலாம்.
KFC chicken online-னிலும் order செய்யலாம். அதற்காக பயன்படும் Java application-னில் MinglesBucket object எப்படி create செய்வது?
வழி பல இருப்பினும், முதல் choice இதோ:
Using Mutators:
public class MinglesBucket { private int smokyChicken; private int spicyChicken; private int topups; private int wings; private int drinks; public void setSmokyChicken(int smokyChicken) { this.smokyChicken = smokyChicken; } public void setSpicyChicken(int spicyChicken) { this.spicyChicken = spicyChicken; } public void setTopups(int topups) { this.topups = topups; } public void setWings(int wings) { this.wings = wings; } public void setDrinks(int drinks) { this.drinks = drinks; } public void processOrder(){ System.out.println("***********************************"); System.out.println("Order \t\t Quantity"); System.out.println("Smoky Chicken: \t" + smokyChicken); System.out.println("Spicy Chicken: \t" + spicyChicken); System.out.println("Topups: \t" + topups); System.out.println("Wings: \t\t" + wings); System.out.println("Drinks: \t" + drinks); System.out.println("***********************************"); } }
public class Client { public static void main(String[] args) { MinglesBucket bucket = new MinglesBucket(); bucket.setSpicyChicken(6); bucket.setSmokyChicken(2); bucket.processOrder(); bucket.setDrinks(2); // Data Integrity is lost! } }
இது மிகவும் எளிய முறை. முதலில் Empty object-ஐ create செய்து விட்டு, setter methods துணை கொண்டு வேண்டிய item மற்றும் quantity-ஐ ஒவ்வொன்றாக add செய்துக் கொள்ளலாம். கடைசியா, processOrder method-ஐ call செய்ய வேண்டும். இங்கே தான் பிரச்னை வருகிறது. processOrder method-ஐ call செய்த பிறகும் கூட, setter methods-ஐ கொண்டு மேலும் items add செய்ய முடியும். Order processing-கிற்கு அனுப்பி வைக்கப்படும் போது object-டின் நிலை ஒன்றும், தற்போது அதன் நிலை வேறொன்றுமாக உள்ளது. Data integrity is lost!
இம்மாதிரியாக Mingles Bucket create செய்வது சரி வராது!
Using Constructors:
So, object create ஆகும் போதே items add பண்ணனும். அதுக்கப்பறம் items add பண்ண allow பண்ண கூடாது. Setters methods-எ தூக்கிட்டா, object-ல value inject பண்ண இன்னொரு வழி constructor! அதுவும் இந்த case-ல object create ஆகும் போது value initialize ஆகணும்னு வேற சொல்றோம்! Constructor சரி வருமான்னு பாக்கலாம்:
இங்க challenge என்னனா, MinglesBucket custom defined. Customer, bucket full-அ spicy chicken வேணும்னு சொல்லலாம். Spicy chicken மற்றும் Smoky chicken mix பண்ணலாம். Chicken Wings, drinks மற்றும் topups மட்டும் போதும்னு சொல்லலாம். இப்படியாக, எல்லா combination-னுக்கும் constructor தனித்தனியா எழுதணும். Impossible! Possible-அ இருந்தாக் கூட code அசிங்கமா இருக்கும்.
public class MinglesBucket { private int smokyChicken; private int spicyChicken; private int topups; private int wings; private int drinks; public MinglesBucket(int spicyChicken, int smokyChicken){ this.spicyChicken = spicyChicken; this.smokyChicken = smokyChicken; } . . . . public void processOrder(){ System.out.println("***********************************"); System.out.println("Order \t\t Quantity"); System.out.println("Smoky Chicken: \t" + smokyChicken); System.out.println("Spicy Chicken: \t" + spicyChicken); System.out.println("Topups: \t" + topups); System.out.println("Wings: \t\t" + wings); System.out.println("Drinks: \t" + drinks); System.out.println("***********************************"); } }
இதற்க்கு தீர்வு தான் Builder pattern.
Step: 1
MinglesBucket items (attributes) -ஐ private final -ஆக்கிவிடுங்கள். final -ங்கறதால, once initialize பண்ணிட்டா, value-வ மாத்த முடியாது. private மற்றும் setter methods இல்ல -ங்கறதால class-க்கு வெளில இருந்து இந்த values-அ access பண்ணவோ மாத்தவோ முடியாது! So, data integrity is preserved!
public class MinglesBucket { private final int smokyChicken; private final int spicyChicken; private final int topups; private final int wings; private final int drinks; }
Step: 2
MinglesBucket object-அ வெளில இருந்து new operator use பண்ணி object create பண்ணனா, empty object create ஆகிவிடும். அதுவும் தவறு! அதை தவிர்க்க, private constructor ஒன்றை எழுதுவோமாக!
public class MinglesBucket { private final int smokyChicken; private final int spicyChicken; private final int topups; private final int wings; private final int drinks;
private MinglesBucket(Builder build){ this.smokyChicken = build.smokyChicken; this.spicyChicken = build.spicyChicken; this.topups = build.topups; this.wings = build.wings; this.drinks = build.drinks; }
}
Step: 3
தற்சமயம், object-டையும் create பண்ண முடியாது. Values-சையும் set பண்ண முடியாது. ஆகவே static inner class தேவை. MinglesBucket class-சில் Builder என்றொரு static inner class எழுத வேண்டும். MinglesBucket-டில் உள்ள அனைத்து attributes-சும் Builder class-சிலும் இருக்க வேண்டும். அதுவும் private -ஆக இருக்க வேண்டும்.
public class MinglesBucket { private final int smokyChicken; private final int spicyChicken; private final int topups; private final int wings; private final int drinks;
private MinglesBucket(Builder build){ this.smokyChicken = build.smokyChicken; this.spicyChicken = build.spicyChicken; this.topups = build.topups; this.wings = build.wings; this.drinks = build.drinks; }
public static class Builder{ private int smokyChicken; private int spicyChicken; private int topups; private int wings; private int drinks; }
}
Step: 4
Builder class-சிலும் attributes private அல்லவா?! அதை access செய்ய mutators வேண்டும். ஒவ்வொரு items-க்கும் ஒரு Setter (builder) method எழுதிடக. அதன் visibility public -ஆக இருக்க வேண்டும். return type Builder class. சுருக்கமாக சொன்னால் values set செய்துவிட்டு current object-டை return செய்கிறோம். இதற்க்கு காரணம் உண்டு, client class எழுதும்போது விளங்கும்.
public class MinglesBucket { private final int smokyChicken; private final int spicyChicken; private final int topups; private final int wings; private final int drinks;
private MinglesBucket(Builder build){ this.smokyChicken = build.smokyChicken; this.spicyChicken = build.spicyChicken; this.topups = build.topups; this.wings = build.wings; this.drinks = build.drinks; }
public static class Builder{ private int smokyChicken; private int spicyChicken; private int topups; private int wings; private int drinks;
public Builder smokyChicken (int quantity){ this.smokyChicken = quantity; return this; } public Builder spicyChicken (int quantity){ this.spicyChicken = quantity; return this; } public Builder topups (int quantity){ this.topups = quantity; return this; } public Builder wings (int quantity){ this.smokyChicken = quantity; return this; } public Builder drinks (int quantity){ this.smokyChicken = quantity; return this; }
}
}
Step: 5
கடைசியாக, build method!
public class MinglesBucket { private final int smokyChicken; private final int spicyChicken; private final int topups; private final int wings; private final int drinks;
private MinglesBucket(Builder build){ this.smokyChicken = build.smokyChicken; this.spicyChicken = build.spicyChicken; this.topups = build.topups; this.wings = build.wings; this.drinks = build.drinks; }
public static class Builder{ private int smokyChicken; private int spicyChicken; private int topups; private int wings; private int drinks;
public Builder smokyChicken (int quantity){ this.smokyChicken = quantity; return this; } public Builder spicyChicken (int quantity){ this.spicyChicken = quantity; return this; } public Builder topups (int quantity){ this.topups = quantity; return this; } public Builder wings (int quantity){ this.smokyChicken = quantity; return this; } public Builder drinks (int quantity){ this.smokyChicken = quantity; return this; }
public MinglesBucket build(){ return new MinglesBucket(this); }
}
}
Client Program:
public class Client { public static void main(String[] args) { MinglesBucket bucket = new MinglesBucket.Builder()
.spicyChicken(6)
.smokyChicken(2)
.drinks(2)
.build();
} }
Client class-ஐ கூர்ந்து கவனியுங்கள். "new MinglesBucket.Builder()" builder object-ஐ முதலில் initialize செய்கிறது. ".spicyChicken(6).smokyChicken(2).drinks(2)" builder methods-ஐ ஒன்றன்பின் ஒன்றாக call செய்கிறது. MinglesBucket-யின் உதிரி பாகங்களை கோர்த்துவிட்டு கடைசியாக அவற்றை ஒன்றாக pack செய்யவது போல .build() method-ஐ call செய்து complete MinglesBucket-ஐ உருவாக்குகிறது. இதை தான் step by step construction of complex object என்கிறார்கள்.
Interview Question:
What is Builder Pattern?
Builder Pattern is a creational design pattern which can be used whenever there is a need to separate object construction from its actual representation. If you look at the example, the MinglesBucket object is not constructed in MinglesBucket class (representation). Rather, created in Builder class!
Comments