Monday, 18 April 2016

Abstract Factory pattern : Example



Suppose you need to write a program to show data in two different places. Let's say from a local or a remote database.
You need to make a connection to a database before working on the data.

LocalMode ----> Local
           ^
           |
    Remote  <---- RemoteMode
ConnectionFactory  <---- DataManager


class DataInfo { }

interface Local {
  DataInfo[] loadDB(String filename);
}

interface Remote extends Local{
  void connect2WWW(String url);
}

class LocalMode implements Local {
  public DataInfo[] loadDB(String name) {
    System.out.print("Load from a local database ");
    return null;
  }
}

class RemoteMode implements Remote {
  public void connect2WWW(String url) {
    System.out.println("Connect to a remote site ");
  }
  public DataInfo[] loadDB(String name) {
     System.out.println("Load from a remote database ");
     return null;
  }
}

// The Abstract Factory
interface ConnectionFactory {
  Local getLocalConnection();
  Remote getRemoteConnection();
}

class DataManager implements ConnectionFactory {
    boolean local = false;
    DataInfo[] data;
    // - - - -
    public Local getLocalConnection() {
        return new LocalMode();
    }
    public Remote getRemoteConnection() {
        return new RemoteMode();
    }
    public  void loadData() {
         if(local){
            Local conn = getLocalConnection();
            data = conn.loadDB("db.db");
         } else {
            Remote conn = getRemoteConnection();
            conn.connect2WWW("http://www.some.where.com");
            data = conn.loadDB("db.db");
         }
         
     }
     // work on data
   
    public void setConnection(boolean b) {
       local = b;
    }
}

Based on the arguments passed to the application, provide the local / remote connection.
LocalMode lm = (LocalMode)dm.getLocalConnection();
RemoteMode rm = (RemoteMode)dm.getRemoteConnection();

No comments:

Post a Comment

Note: only a member of this blog may post a comment.