diff --git a/README.md b/README.md
index 9e0034c..3499147 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,30 @@
-# DesignPatternsJava9
-This repo consists Gang of Four Design patterns code on Java 9. Each branch in the repository has code of 1 design pattern. Switch repository to try out different design patterns.
+# What is Factory Design Pattern 
+Factory pattern creates object without exposing the creation logic to the client and refer to newly created object using a common interface.
+
+## Diagram
+![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/factory/diagrams/3.4%20Factory%20Design%20Pattern.png "Diagram")
+
+![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/factory/diagrams/Factory%20Icecream%20sequene%20diagram.png "Diagram")
+
+### When to use Factory Design Pattern 
+Factory design pattern is used when we have a super class with multiple sub-classes and based on input one of the sub-class is expected to be returned.
+
+### Learn Design Patterns with Java by Aseem Jain
+This repository contains working project code used in video Course by Packt Publication with title "Learn Design Patterns with Java " authored by "Aseem Jain".
+
+### Course link: 
+https://www.packtpub.com/application-development/learn-design-patterns-java-9-video
+
+### ![ http://in.linkedin.com/in/premaseem](https://github.com/premaseem/DesignPatternsJava9/blob/master/linkedin.png "http://in.linkedin.com/in/premaseem") Profile:  http://in.linkedin.com/in/premaseem
+
+### Authors blog on design patterns:
+https://premaseem.wordpress.com/category/computers/design-patterns/
+
+### Software Design pattern community face book page:
+https://www.facebook.com/DesignPatternGuru/
+
+### Note: 
+* This code base will work on Java 9 and above versions. 
+* `diagrams` folders carry UML diagrams.
+* `pattern` folder has code of primary example. 
+* `patternBonus` folder has code of secondary or bonus example.
diff --git a/diagrams/3.4 Factory Design Pattern.png b/diagrams/3.4 Factory Design Pattern.png
new file mode 100644
index 0000000..202982b
Binary files /dev/null and b/diagrams/3.4 Factory Design Pattern.png differ
diff --git a/diagrams/Factory Icecream sequene diagram.png b/diagrams/Factory Icecream sequene diagram.png
new file mode 100644
index 0000000..0dd058e
Binary files /dev/null and b/diagrams/Factory Icecream sequene diagram.png differ
diff --git a/pattern/src/com/premaseem/Client.java b/pattern/src/com/premaseem/Client.java
index 15f05df..7a814d9 100644
--- a/pattern/src/com/premaseem/Client.java
+++ b/pattern/src/com/premaseem/Client.java
@@ -6,8 +6,61 @@
 @link: https://premaseem.wordpress.com/category/computers/design-patterns/
 @copyright: 2018 Packt Publication
 */
+
+import com.premaseem.icecreams.ChocolateIceCream;
+import com.premaseem.icecreams.IceCream;
+import com.premaseem.icecreams.StrawberryIceCream;
+
+import java.util.Scanner;
+
 public class Client {
     public static void main (String[] args) {
-        System.out.println("Singleton cook example ");
+        System.out.println("Ice cream factory example ");
+        System.out.println("Please enter your ice cream choice");
+        System.out.println("Strawberry");
+        System.out.println("Chocolate");
+
+        Scanner scan = new Scanner(System.in);
+        String iceCreamChoice =   scan.next();
+
+//        Tight coupling
+//        StrawberryIceCream strawberryIceCream =null;
+//        ChocolateIceCream chocolateIceCream = null;
+
+        // Loose coupling using interface
+        IceCream iceCream = null;
+
+//        Sphegati code with if else ladder
+//        if (iceCreamChoice.equalsIgnoreCase("Strawberry")){
+//            strawberryIceCream = new StrawberryIceCream();
+//        }else if (iceCreamChoice.equalsIgnoreCase("Chocolate")){
+//            chocolateIceCream = new ChocolateIceCream();
+//        }
+
+        // Crisp, reusable, centralized code using factory
+        // IceCreamFactory iceCreamFactory = new IceCreamFactory();
+
+        // Virtual constructor ( takes care of configuration )
+        iceCream = IceCreamFactory.createIceCream(iceCreamChoice);
+
+//        Repeatative code to even print
+//        System.out.print("Ice cream of your choice is ");
+//        if (strawberryIceCream != null){
+//            System.out.println(strawberryIceCream);
+//        }
+//
+//        if (chocolateIceCream != null){
+//            System.out.println(chocolateIceCream);
+//        }
+
+        System.out.print("Ice cream of your choice is "+ iceCream.getIceCreamName());
+        System.out.println(iceCream);
+
+        System.out.println("Lessons Learnt");
+        System.out.println("Creation is easy and simplified with virtual constructor");
+        System.out.println("Centralized code easy to maintain and extend");
+        System.out.println("Loosely coupled code with interface");
+        System.out.println("Polymorphism in full force");
+
     }
 }
diff --git a/pattern/src/com/premaseem/IceCreamFactory.java b/pattern/src/com/premaseem/IceCreamFactory.java
new file mode 100644
index 0000000..5f31e44
--- /dev/null
+++ b/pattern/src/com/premaseem/IceCreamFactory.java
@@ -0,0 +1,27 @@
+package com.premaseem;
+
+import com.premaseem.icecreams.ChocolateIceCream;
+import com.premaseem.icecreams.IceCream;
+import com.premaseem.icecreams.StrawberryIceCream;
+
+/*
+@author: Aseem Jain
+@title: Design Patterns with Java 9
+@link: https://premaseem.wordpress.com/category/computers/design-patterns/
+*/
+
+public class IceCreamFactory {
+
+    static public IceCream createIceCream(String iceCreamChoice){
+        IceCream iceCream = null;
+
+        if (iceCreamChoice.equalsIgnoreCase("Strawberry")){
+            iceCream = new StrawberryIceCream(2,120);
+
+        }else if (iceCreamChoice.equalsIgnoreCase("Chocolate")){
+            iceCream = new ChocolateIceCream(2,250);
+        }
+
+        return iceCream;
+    }
+}
diff --git a/pattern/src/com/premaseem/icecreams/ChocolateIceCream.java b/pattern/src/com/premaseem/icecreams/ChocolateIceCream.java
new file mode 100644
index 0000000..16100b9
--- /dev/null
+++ b/pattern/src/com/premaseem/icecreams/ChocolateIceCream.java
@@ -0,0 +1,37 @@
+package com.premaseem.icecreams;
+
+/*
+@author: Aseem Jain
+@title: Design Patterns with Java 9
+@link: https://premaseem.wordpress.com/category/computers/design-patterns/
+*/
+public class ChocolateIceCream implements IceCream {
+
+    public ChocolateIceCream (Integer cost, Integer calories){
+        this.cost =cost;
+        this.calories =calories;
+    }
+
+    String brand = "";
+    Integer cost = 0;
+    Integer calories = 0;
+
+    public String toString () {
+        return this.getClass().getSimpleName() + " with Calories: " + getCalories() + " and cost: $" + getCost();
+    }
+
+    @Override
+    public Integer getCalories () {
+        return calories;
+    }
+
+    @Override
+    public Integer getCost () {
+        return cost;
+    }
+
+    @Override
+    public String getIceCreamName () {
+        return this.getClass().getSimpleName();
+    }
+}
diff --git a/pattern/src/com/premaseem/icecreams/IceCream.java b/pattern/src/com/premaseem/icecreams/IceCream.java
new file mode 100644
index 0000000..6c6627a
--- /dev/null
+++ b/pattern/src/com/premaseem/icecreams/IceCream.java
@@ -0,0 +1,16 @@
+package com.premaseem.icecreams;
+
+/*
+@author: Aseem Jain
+@title: Design Patterns with Java 9
+@link: https://premaseem.wordpress.com/category/computers/design-patterns/
+*/
+public interface IceCream {
+
+    Integer getCalories();
+    Integer getCost();
+    String getIceCreamName();
+
+
+
+}
diff --git a/pattern/src/com/premaseem/icecreams/StrawberryIceCream.java b/pattern/src/com/premaseem/icecreams/StrawberryIceCream.java
new file mode 100644
index 0000000..115f001
--- /dev/null
+++ b/pattern/src/com/premaseem/icecreams/StrawberryIceCream.java
@@ -0,0 +1,37 @@
+package com.premaseem.icecreams;
+
+/*
+@author: Aseem Jain
+@title: Design Patterns with Java 9
+@link: https://premaseem.wordpress.com/category/computers/design-patterns/
+*/
+public class StrawberryIceCream implements IceCream {
+
+    public StrawberryIceCream(Integer cost,Integer calories){
+        this.cost =cost;
+        this.calories =calories;
+    }
+
+    String brand = "";
+    Integer cost = 0;
+    Integer calories = 0;
+
+    public String toString () {
+        return this.getClass().getSimpleName() + " with Calories: " + getCalories() + " and cost: $" + getCost();
+    }
+
+    @Override
+    public Integer getCalories () {
+        return calories;
+    }
+
+    @Override
+    public Integer getCost () {
+        return cost;
+    }
+
+    @Override
+    public String getIceCreamName () {
+        return this.getClass().getSimpleName();
+    }
+}
diff --git a/patternBonus/src/com/premaseem/Client.java b/patternBonus/src/com/premaseem/Client.java
index 15f05df..d02499c 100644
--- a/patternBonus/src/com/premaseem/Client.java
+++ b/patternBonus/src/com/premaseem/Client.java
@@ -1,5 +1,10 @@
 package com.premaseem;
 
+import com.premaseem.factory.PizzaBase;
+import com.premaseem.factory.PizzaFactory;
+
+import java.util.Scanner;
+
 /*
 @author: Aseem Jain
 @title: Design Patterns with Java 9
@@ -7,7 +12,31 @@
 @copyright: 2018 Packt Publication
 */
 public class Client {
-    public static void main (String[] args) {
-        System.out.println("Singleton cook example ");
+    public static void main(String[] args) {
+        Scanner scan = new Scanner(System.in);
+        int repeatRunFlag = 1;
+        while (repeatRunFlag == 1) {
+
+            System.out.println("This is the Client Main Factory Pattern ");
+
+            System.out.println("What kind of Pizza would you like to have ? ");
+            System.out.println("Enter veg for veg pizza ");
+            System.out.println("Enter non-veg for Non veg pizza ");
+            System.out.println("Enter max for Non Mexican pizza ");
+
+            String pizzaType =   scan.next();
+            PizzaBase pizza = PizzaFactory.getPizza(pizzaType);
+
+            System.out.println("Your final order is");
+            System.out.println(pizza.getDescription());
+            System.out.println("Toal cost of order is " + pizza.getCost());
+            System.out.println("\n $$$$$$$$$$$$$$$$$$$$  Thanks by Prem Aseem $$$$$$$$$$$$$$$$$$$$$$ \n ");
+            System.out.println("Do you want to Re-run this program - Press 1 for yes and 0 or other digits to EXIT ");
+            try{
+                repeatRunFlag = scan.nextInt();
+            }catch(Exception e){
+                repeatRunFlag = 0;
+            }
+        }
     }
 }
diff --git a/patternBonus/src/com/premaseem/factory/DefaultPizza.java b/patternBonus/src/com/premaseem/factory/DefaultPizza.java
new file mode 100644
index 0000000..359e31b
--- /dev/null
+++ b/patternBonus/src/com/premaseem/factory/DefaultPizza.java
@@ -0,0 +1,17 @@
+package com.premaseem.factory;
+
+public class DefaultPizza implements PizzaBase {
+
+	@Override
+    public double getCost() {
+	    // TODO Auto-generated method stub
+	    return 5;
+    }
+
+	@Override
+    public String getDescription() {
+	    // TODO Auto-generated method stub
+	    return "complementry pizza as order item is not available right now with us";
+    }
+
+}
diff --git a/patternBonus/src/com/premaseem/factory/MexicanPizza.java b/patternBonus/src/com/premaseem/factory/MexicanPizza.java
new file mode 100644
index 0000000..0938441
--- /dev/null
+++ b/patternBonus/src/com/premaseem/factory/MexicanPizza.java
@@ -0,0 +1,17 @@
+package com.premaseem.factory;
+
+public class MexicanPizza implements PizzaBase {
+
+	@Override
+    public double getCost() {
+	    // TODO Auto-generated method stub
+	    return 13;
+    }
+
+	@Override
+    public String getDescription() {
+	    // TODO Auto-generated method stub
+	    return "Mexican Pizza";
+    }
+
+}
diff --git a/patternBonus/src/com/premaseem/factory/NonVegPizza.java b/patternBonus/src/com/premaseem/factory/NonVegPizza.java
new file mode 100644
index 0000000..d29c506
--- /dev/null
+++ b/patternBonus/src/com/premaseem/factory/NonVegPizza.java
@@ -0,0 +1,17 @@
+package com.premaseem.factory;
+
+public class NonVegPizza implements PizzaBase {
+
+	@Override
+    public double getCost() {
+	    // TODO Auto-generated method stub
+	    return 24;
+    }
+
+	@Override
+    public String getDescription() {
+	    // TODO Auto-generated method stub
+	    return "Non Veg Pizza";
+    }
+
+}
diff --git a/patternBonus/src/com/premaseem/factory/PizzaBase.java b/patternBonus/src/com/premaseem/factory/PizzaBase.java
new file mode 100644
index 0000000..cb08789
--- /dev/null
+++ b/patternBonus/src/com/premaseem/factory/PizzaBase.java
@@ -0,0 +1,8 @@
+package com.premaseem.factory;
+
+public interface PizzaBase {
+	
+	double getCost();
+	String getDescription();
+
+}
diff --git a/patternBonus/src/com/premaseem/factory/PizzaFactory.java b/patternBonus/src/com/premaseem/factory/PizzaFactory.java
new file mode 100644
index 0000000..b351e0d
--- /dev/null
+++ b/patternBonus/src/com/premaseem/factory/PizzaFactory.java
@@ -0,0 +1,23 @@
+package com.premaseem.factory;
+
+public class PizzaFactory {
+
+	
+	static public PizzaBase getPizza(String pizzaType){
+		PizzaBase pizza = null;
+		
+		if(pizzaType.equalsIgnoreCase("veg")){
+			pizza = new VegPizza();
+		}else
+			if(pizzaType.equalsIgnoreCase("nonveg")){
+				pizza = new NonVegPizza();
+			}else
+				if(pizzaType.equalsIgnoreCase("mexican")){
+					pizza = new MexicanPizza();
+				}else{
+					pizza = new DefaultPizza();
+				}
+		return pizza;
+	}
+	
+}
diff --git a/patternBonus/src/com/premaseem/factory/VegPizza.java b/patternBonus/src/com/premaseem/factory/VegPizza.java
new file mode 100644
index 0000000..61995f4
--- /dev/null
+++ b/patternBonus/src/com/premaseem/factory/VegPizza.java
@@ -0,0 +1,17 @@
+package com.premaseem.factory;
+
+public class VegPizza implements PizzaBase {
+
+	@Override
+    public double getCost() {
+	    // TODO Auto-generated method stub
+	    return 10;
+    }
+
+	@Override
+    public String getDescription() {
+	    // TODO Auto-generated method stub
+	    return "Veg Pizza";
+    }
+
+}