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

How to Create a Namespace in Aerospike Database

                      T his post is about creating a namespace in Aerospike. I could not find any concrete method to create a namespace like create database in MySQL and MongoDB. So I am suggesting a way to create a namespace in Aerospike Database. Step-1: Locate config file aerospike.conf and open it in your favorite editor and make sure you have permission to modify the file. In my system the path of file /etc/aerospike/aerospike.conf (Default in Ubuntu). Here the content of the file. # Aerospike database configuration file. service { user root group root paxos-single-replica-limit 1 # Number of nodes where the replica pidfile /var/run/aerospike/asd.pid service-threads 4 transaction-queues 4 transaction-threads-per-queue 4 proto-fd-max 15000 } logging { # Log file must be an absolute path. file /var/log/aerospike/aerospike.log { context any info } } network { service { address any port 3000 } heartbeat { mode multicast address 239.1.99.222 p

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