Skip to main content

Builder Pattern : Java Code Example

Builder Pattern

Builder Pattern is used when the increase of object constructor parameter combination leads to an exponential list of constructors. It is a solution to the telescoping constructor anti-pattern.


Let's describe the pattern by using a sample requirement.

Problem:

We need to create a class for a Customer in a Bank and need following attributes in the Customer object.
{Name, Father's Name, Date Of Birth, Mobile, Email, PAN, Permanent Address, Correspondence Address, Account, Branch}
Constraint : Name,Date Of Birth,Account can not be null or empty
There are 10 attributes in the objects So there will be total 2^10(1024) possible constructor and It is not practical to write all required constructors.

One alternative could be to use Setter method but it will not work if any attribute has final modifier and would be difficult to fulfill the constraint that some attributes can not be null or empty.

Now We will see how Builder Design Pattern helps to solve the above problem.The below code is self explanatory, Just read the code and you will understand how builder pattern works.

Java Code Example:

public class Customer {

 private final String name;
 private final String fatherName;
 private final Date dob;
 private final String mobile;
 private final String email;
 private final String pan;
 private final String permAddress;
 private final String mailAddress;
 private final String account;
 private final String branch;

 private Customer(String name, String fatherName, Date dob, String mobile,
                         String email, String pan,String permAddress,
                         String mailAddress, String account, String branch) {
  this.name = name;
  this.fatherName = fatherName;
  this.dob = dob;
  this.mobile = mobile;
  this.email = email;
  this.pan = pan;
  this.permAddress = permAddress;
  this.mailAddress = mailAddress;
  this.account = account;
  this.branch = branch;
 }

 public static class Builder {

  private String name;
  private String fatherName;
  private Date dob;
  private String mobile;
  private String email;
  private String pan;
  private String permAddress;
  private String mailAddress;
  private String account;
  private String branch;

  public Builder withName(final String name) {

   this.name = name;
   return this;
  }

  public Builder withFatheName(final String fatherName) {

   this.fatherName = fatherName;
   return this;
  }

  public Builder withDob(final Date dob) {

   this.dob = dob;
   return this;
  }

  public Builder withMobile(final String mobile) {

   this.mobile = mobile;
   return this;
  }

  public Builder withEmail(final String email) {

   this.email = email;
   return this;
  }

  public Builder withPan(final String pan) {

   this.pan = pan;
   return this;
  }

  public Builder withPermAddress(final String permAddress) {

   this.permAddress = permAddress;
   return this;
  }

  public Builder withMailAddress(final String mailAddress) {

   this.mailAddress = mailAddress;
   return this;
  }

  public Builder withAccount(final String account) {

   this.account = account;
   return this;
  }

  public Builder withBranch(final String branch) {

   this.branch = branch;
   return this;
  }

  public Customer build() {

   // Check Object Constraint
   if (name == null || dob == null || account == null) {
    throw new IllegalStateException("Cannot create Customer");
   }

   // Instantiate Customer Object
   return new Customer(name, fatherName, dob, mobile, email,
                                 pan, permAddress, mailAddress, account, branch);
  }
 }

}


Comments

Popular posts from this blog

java.lang.IllegalArgumentException: Could not instantiate implementation: org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager

If you are trying to get started with Janus Graph with Apache Cassandra. You may get the following error. Caused by: org.janusgraph.diskstorage.TemporaryBackendException: Temporary failure in storage backend at org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager.getCassandraPartitioner(CassandraThriftStoreManager.java:219) ~[janusgraph-cassandra-0.2.0.jar:na] at org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager.<init>(CassandraThriftStoreManager.java:198) ~[janusgraph-cassandra-0.2.0.jar:na] ... 48 common frames omitted Caused by: org.apache.thrift.transport.TTransportException: java.net.ConnectException: Connection refused (Connection refused) at org.apache.thrift.transport.TSocket.open(TSocket.java:187) ~[libthrift-0.9.2.jar:0.9.2] at org.apache.thrift.transport.TFramedTransport.open(TFramedTransport.java:81) ~[libthrift-0.9.2.jar:0.9.2] at org.janusgraph.diskstorage.cassandra.thrift.thriftpool.CTConnectionFactory.makeR...

com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server

If you are trying to connect Mongo DB Server and it insanely throwing following error. com.mongodb.MongoTimeoutException : Timed out after 1000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=192.168.1.10:27010, type=UNKNOWN, state=CONNECTING, exception={ com.mongodb.MongoSecurityException: Exception authenticating MongoCredential {mechanism=null, userName='user123', source='admin', password=<hidden>, mechanismProperties={}}}, caused by {com.mongodb.MongoCommandException: Command failed with error 18 : 'Authentication failed.' on server 192.168.1.10:27010 . The full response is { "ok" : 0.0, "code" : 18, "errmsg" : "Authentication failed." }}}] If you start looking the error content First you encounter with Timeout Exception which may mislead you. It is basically an authentication error. I...

Move like a Ninja on Terminal Console

If you are in IT and do a lot of stuff on terminal, this is the post for you. In the following post, we will explore various key shortcuts to jump and edit on console. Note:- Short keys may behave differnt on differnt OS systems. These keys best work with Linux sytem, For mac OS you have to enable Option key as Meta key in case of Alt . I have never checked these on windows, Please share your experinece with windows in comments. ------------------------------------------------------------------ Edit Control Move forward one char: Ctrl + f Move backward one char: Ctrl + b Move forward one word: Alt + f Move backward one word: Alt + b Move to end: Ctrl + e #Like End Move to start: Ctrl + a #Like Home Jump toggle between current location and start: Ctrl + xx Delete forward one char: Ctrl + d #Like Delete Delete backward one char: Ctrl + h #Like Backspace Delete forward one word: Alt + d Delete backward one word: Ctrl + w Delete to end: Ctrl + k Delete to start: Ctrl + u Undo: Ct...