বিল্ডার হচ্ছে ক্রিয়েশনাল ডিজাইন প্যাটার্ন যার মাধ্যমে কম্প্লেক্স কোন অব্জেক্ট স্টেপ বাই স্টেপ তৈরি করা যায়।
**
**
এমন কোন সিচুয়েশন ধরা যাক যেখানে, কোন অব্জেক্ট ইনিশিয়ালাইজ করতে কন্সট্রক্টর মেথড এর মাধ্যমে অনেক প্যারামিটার নিয়ে একটার পর একটা প্রোপার্টি সেট করতে হয়। এরমধ্যে, কোন অব্জেক্ট এর জন্য কিছু ইন্সট্যান্স ভ্যারিয়েবল None থাকতে পারে।
\
যদি ইনিফিউচারে নতুন কোন প্যারামিটার অ্যাড করতে হয় তাহলে সেক্ষেত্রে এই ক্লাস ব্যাবহার করা ক্লায়েন্ট কোড ক্র্যাশ করতে পারে।
\
সলিউশন ঃ সরাসরি কন্সট্রাক্টর মেথডের মাধ্যমে আর্গুমেন্ট না নিয়ে তার পরিবর্তে Builder Object নিতে হবে। এবং, Builder Object এর প্রোপার্টির মাধ্যমে অব্জেক্ট ইনিশিয়ালাইজ করতে হবে ।
Code Example
মেইন ক্লাস যার অব্জেক্ট আমরা তৈরি করতে চাই
public class User {
private String first_name;
private String last_name;
private String username;
private String phone;
private String email;
private String address;
private String password;
public User(UserBuilder builder) {
this.first_name = builder.first_name;
this.last_name = builder.last_name;
this.username = builder.username;
this.phone= builder.phone;
this.email= builder.email;
this.address = builder.address;
this.password = builder.password;
}
@Override
public String toString() {
return("Username : "+this.username);
}
}
Builder Class যার মাধ্যমে স্টেপ বাই স্টেপ অব্জেক্ট তৈরি করে সেই অব্জেক্ট User Constructor এ পাস করবো
public class UserBuilder {
String first_name;
String last_name;
String username;
String phone;
String email;
String address;
String password;
public UserBuilder set_first_name(String first_name) {
this.first_name = first_name;
return this;
}
public UserBuilder set_last_name(String last_name) {
this.last_name = last_name;
return this;
}
public UserBuilder set_username(String username) {
this.username = username;
return this;
}
public UserBuilder set_phone(String phone) {
this.phone = phone;
return this;
}
public UserBuilder set_email(String email) {
this.email = email;
return this;
}
public UserBuilder set_address(String address) {
this.address = address;
return this;
}
public UserBuilder set_password(String password) {
this.password = password;
return this;
}
public User build() {
return new User(this);
}
}
এখন মনে প্রশ্ন হতে পারে , কেন প্রতিটা মেথডের রিটার্ন টাইপ হিসেবে UserBuilder Object type রিটার্ন করলাম ? 🤔\
উত্তর ঃ যদি মেথড এর রিটার্ন টাইপ হিসেবে this রিটার্ন করি তাহলে চেইনিং এর মাধ্যমে প্রতিটা মেথড এক্সেস করে ভ্যারিয়েবল সেট করতে পারবো।
উদাহারন দিয়ে দেখা যাক ঃ
public class Main {
public static void main(String[] args) {
UserBuilder builder = new UserBuilder();
builder.set_first_name("Ata Alahy")
.set_last_name("Nishan")
.set_username("nishan.xyz")
.set_adress("Dhaka, Bangladesh")
.set_password("password");
//এখানে builder object তৈরি করে চেইনিং এর মাধ্যমে মেথড এক্সেস করে ভ্যালু সেট করতে পারছি। কারন ঃ প্রতিটা মেথড builder object রিটার্ন করছে।
User new_user = builder.build();
}
}
Comments
Join the discussionNo comments yet. Be the first to comment.
Design Pattern
This is a design pattern series. Where you can find important object oriented patterns that helps you to write better maintainable and clean code


