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"; + } + +}