diff --git a/README.md b/README.md index 9e0034c..0e45575 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,29 @@ -# 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 Builder Design Pattern +* The Builder pattern is a GOF Creational design pattern. Builder pattern hide the complexity of object creation.It Encapsulates creating and assembling the parts of a complex object in a separate Builder object. +* A class delegates object creation to a Builder object instead of creating the objects directly. + +## Diagram +![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/builder/diagrams/3.3%20Builder%20Design%20pattern.png "Diagram") + +### When to use Builder Design Pattern +When application needs to create complex objects with mutliple steps involved in creation and expect final object as outcome. + +### 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.3 Builder Design pattern.png b/diagrams/3.3 Builder Design pattern.png new file mode 100644 index 0000000..a831d23 Binary files /dev/null and b/diagrams/3.3 Builder Design pattern.png differ diff --git a/pattern/src/com/premaseem/Client.java b/pattern/src/com/premaseem/Client.java index 15f05df..17f964e 100644 --- a/pattern/src/com/premaseem/Client.java +++ b/pattern/src/com/premaseem/Client.java @@ -1,13 +1,25 @@ package com.premaseem; +import com.premaseem.builder.House; +import com.premaseem.builder.OneBedroomHouseBuilder; +import com.premaseem.builder.TwoBedroomHouseBuilder; +import com.premaseem.director.Architect; + /* @author: Aseem Jain @title: Design Patterns with Java 9 @link: https://premaseem.wordpress.com/category/computers/design-patterns/ -@copyright: 2018 Packt Publication */ public class Client { public static void main (String[] args) { - System.out.println("Singleton cook example "); + System.out.println("Builder Design pattern example "); + Architect architect = new Architect(); + + // Hiding complexity and building one bed room house + architect.setHouseBuilder(new OneBedroomHouseBuilder()); + architect.buildHouse(); + House house = architect.getFinishedHouse(); + System.out.println(house); + } } diff --git a/pattern/src/com/premaseem/builder/House.java b/pattern/src/com/premaseem/builder/House.java new file mode 100644 index 0000000..799981a --- /dev/null +++ b/pattern/src/com/premaseem/builder/House.java @@ -0,0 +1,32 @@ +package com.premaseem.builder; + +import com.premaseem.room.Room; + +import java.util.ArrayList; +import java.util.List; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ +/* "Product" */ +public class House { + List rooms = new ArrayList<>(); + private String exteriorColor = "while"; + + public String getExteriorColor () { + return exteriorColor; + } + + public void setExteriorColor (String exteriorColor) { + this.exteriorColor = exteriorColor; + } + + @Override + public String toString () { + System.out.println("house has total rooms " + rooms.size()); + System.out.println("house has color " + getExteriorColor()); + return ""; + } +} diff --git a/pattern/src/com/premaseem/builder/HouseBuilder.java b/pattern/src/com/premaseem/builder/HouseBuilder.java new file mode 100644 index 0000000..1243c45 --- /dev/null +++ b/pattern/src/com/premaseem/builder/HouseBuilder.java @@ -0,0 +1,39 @@ +package com.premaseem.builder; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ +/* "Abstract Builder" */ +public abstract class HouseBuilder { + public House getHouse () { + return house; + } + + private House house =null; + + public HouseBuilder(){ + house = new House(); + } + + public abstract void addRooms(); + + public void addSecuritySystem(){ + System.out.println("adding security system"); + } + + public void addPlumbingSystem(){ + System.out.println("adding plumbing system"); + } + + public void addAirConditionerSystem(){ + System.out.println("adding air conditioning system"); + } + + public void paintHouse(String color){ + System.out.println("paiting house with color " + color); + house.setExteriorColor(color); + } + +} diff --git a/pattern/src/com/premaseem/builder/OneBedroomHouseBuilder.java b/pattern/src/com/premaseem/builder/OneBedroomHouseBuilder.java new file mode 100644 index 0000000..2fb4fdf --- /dev/null +++ b/pattern/src/com/premaseem/builder/OneBedroomHouseBuilder.java @@ -0,0 +1,22 @@ +package com.premaseem.builder; + +import com.premaseem.room.BathRoom; +import com.premaseem.room.BedRoom; +import com.premaseem.room.LivingRoom; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ + +/* "ConcreteBuilder" */ +public class OneBedroomHouseBuilder extends HouseBuilder{ + + @Override + public void addRooms () { + getHouse().rooms.add(new BathRoom()); + getHouse().rooms.add(new BedRoom()); + getHouse().rooms.add(new LivingRoom()); + } +} diff --git a/pattern/src/com/premaseem/builder/TwoBedroomHouseBuilder.java b/pattern/src/com/premaseem/builder/TwoBedroomHouseBuilder.java new file mode 100644 index 0000000..8a671b1 --- /dev/null +++ b/pattern/src/com/premaseem/builder/TwoBedroomHouseBuilder.java @@ -0,0 +1,22 @@ +package com.premaseem.builder; + +import com.premaseem.room.BathRoom; +import com.premaseem.room.BedRoom; +import com.premaseem.room.LivingRoom; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ + +/* "ConcreteBuilder" */ +public class TwoBedroomHouseBuilder extends HouseBuilder{ + + @Override + public void addRooms () { + getHouse().rooms.add(new BathRoom()); + getHouse().rooms.add(new BedRoom()); + getHouse().rooms.add(new LivingRoom()); + } +} diff --git a/pattern/src/com/premaseem/director/Architect.java b/pattern/src/com/premaseem/director/Architect.java new file mode 100644 index 0000000..1d6263a --- /dev/null +++ b/pattern/src/com/premaseem/director/Architect.java @@ -0,0 +1,32 @@ +package com.premaseem.director; + +import com.premaseem.builder.House; +import com.premaseem.builder.HouseBuilder; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ + +/* "Director" */ +public class Architect { + + private HouseBuilder houseBuilder; + + public void setHouseBuilder (HouseBuilder houseBuilder) { + this.houseBuilder = houseBuilder; + } + + public void buildHouse() { + houseBuilder.addRooms(); + houseBuilder.addPlumbingSystem(); + houseBuilder.addAirConditionerSystem(); + houseBuilder.addSecuritySystem(); + houseBuilder.paintHouse("white"); + } + + public House getFinishedHouse(){ + return houseBuilder.getHouse(); + } +} diff --git a/pattern/src/com/premaseem/room/BathRoom.java b/pattern/src/com/premaseem/room/BathRoom.java new file mode 100644 index 0000000..0e31541 --- /dev/null +++ b/pattern/src/com/premaseem/room/BathRoom.java @@ -0,0 +1,14 @@ +package com.premaseem.room; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ +public class BathRoom extends Room { + +public BathRoom (){ + setNumberOfWindows(0); + setNumberOfWalls(3); +} +} diff --git a/pattern/src/com/premaseem/room/BedRoom.java b/pattern/src/com/premaseem/room/BedRoom.java new file mode 100644 index 0000000..cc75783 --- /dev/null +++ b/pattern/src/com/premaseem/room/BedRoom.java @@ -0,0 +1,14 @@ +package com.premaseem.room; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ +public class BedRoom extends Room { + +public BedRoom(){ + setNumberOfWindows(2); + setNumberOfWalls(4); +} +} diff --git a/pattern/src/com/premaseem/room/LivingRoom.java b/pattern/src/com/premaseem/room/LivingRoom.java new file mode 100644 index 0000000..e401f64 --- /dev/null +++ b/pattern/src/com/premaseem/room/LivingRoom.java @@ -0,0 +1,14 @@ +package com.premaseem.room; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ +public class LivingRoom extends Room { + +public LivingRoom (){ + setNumberOfWindows(2); + setNumberOfWalls(3); +} +} diff --git a/pattern/src/com/premaseem/room/Room.java b/pattern/src/com/premaseem/room/Room.java new file mode 100644 index 0000000..0de4757 --- /dev/null +++ b/pattern/src/com/premaseem/room/Room.java @@ -0,0 +1,30 @@ +package com.premaseem.room; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ +public class Room { + + private Integer numberOfWindows = 1; + private Integer numberOfWalls = 4; + + + public Integer getNumberOfWindows () { + return numberOfWindows; + } + + public void setNumberOfWindows (Integer numberOfWindows) { + this.numberOfWindows = numberOfWindows; + } + + public Integer getNumberOfWalls () { + return numberOfWalls; + } + + public void setNumberOfWalls (Integer numberOfWalls) { + this.numberOfWalls = numberOfWalls; + } +} + diff --git a/patternBonus/src/com/premaseem/Client.java b/patternBonus/src/com/premaseem/Client.java deleted file mode 100644 index 15f05df..0000000 --- a/patternBonus/src/com/premaseem/Client.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.premaseem; - -/* -@author: Aseem Jain -@title: Design Patterns with Java 9 -@link: https://premaseem.wordpress.com/category/computers/design-patterns/ -@copyright: 2018 Packt Publication -*/ -public class Client { - public static void main (String[] args) { - System.out.println("Singleton cook example "); - } -} diff --git a/patternBonus/src/com/premaseem/McDonaldsMealBuilder/ClientFile.java b/patternBonus/src/com/premaseem/McDonaldsMealBuilder/ClientFile.java new file mode 100644 index 0000000..66585ed --- /dev/null +++ b/patternBonus/src/com/premaseem/McDonaldsMealBuilder/ClientFile.java @@ -0,0 +1,44 @@ +package com.premaseem.McDonaldsMealBuilder; + +import java.util.Scanner; + +public class ClientFile { + + public static void main(String[] args) { + + System.out.println("Welcome to the Mc Donal which uses Builder Design pattern to build their Meals "); + Scanner scan = new Scanner(System.in); + + int repeatRunFlag = 1; + MealBuilder mealBuilder = new MealBuilder(); + Meal meal = null; + while (repeatRunFlag == 1) { + System.out.println("Which Meal would you like to order ? "); + System.out.println("press 1 for Veg Meal"); + System.out.println("press 2 for Non Veg Meal "); + + int type = scan.nextInt(); + if (type == 1) { + meal = mealBuilder.buildVegMeal(); + } else { + meal = mealBuilder.buildNonVegMeal(); + } + + + System.out.println(meal); + System.out.println("============================="); + + System.out.println("Press 1 to Repeat .... "); + try { + repeatRunFlag = scan.nextInt(); + } catch (Exception e) { + repeatRunFlag = 0; + } + + } + + System.out.println("\n $$$$$$$$$$$$$$$$$$$$ Thanks by Prem Aseem $$$$$$$$$$$$$$$$$$$$$$ \n "); + System.out.println("\n $$$$$$$$$$$$$$$$$$$$$ www.premaseem.me $$$$$$$$$$$$$$$$$$$$$$ \n "); + + } +} diff --git a/patternBonus/src/com/premaseem/McDonaldsMealBuilder/Meal.java b/patternBonus/src/com/premaseem/McDonaldsMealBuilder/Meal.java new file mode 100644 index 0000000..aa98337 --- /dev/null +++ b/patternBonus/src/com/premaseem/McDonaldsMealBuilder/Meal.java @@ -0,0 +1,77 @@ +package com.premaseem.McDonaldsMealBuilder; + +import java.util.ArrayList; +import java.util.List; + + +public class Meal{ + int cost; + List meal = new ArrayList(); + void addItem(Item item){ + cost += item.cost; + meal.add(item); + } + @Override + public String toString() { + System.out.println("You meal is "); + for(Item itm: meal){ + System.out.print (itm.name + " "); + } + System.out.println(); + System.out.println("Toal cost - " + cost); + return " "; + } +} + +abstract class Item{ + Wrap warp; + int cost =2; + String name; +} + +class Burger extends Item{ +} + +class VegBurger extends Burger { + public VegBurger() { + this.name = "VegBurger"; + } +} + +class ChikenBurger extends Burger { + public ChikenBurger() { + this.name = "ChikenBurger"; + } +} + +class Wrap { + public String name; +} + +class Bottle extends Wrap { + public Bottle() { + this.name = "Bottle"; + } +} + +class Box extends Wrap { + public Box() { + this.name = "Box"; + } +} + +class Drink extends Item { +} + +class Milk extends Drink { + public Milk() { + this.name = "Milk"; + cost = 10; + } +} + +class Blood extends Drink { + public Blood() { + this.name = "Blood"; + } +} diff --git a/patternBonus/src/com/premaseem/McDonaldsMealBuilder/MealBuilder.java b/patternBonus/src/com/premaseem/McDonaldsMealBuilder/MealBuilder.java new file mode 100644 index 0000000..67c2792 --- /dev/null +++ b/patternBonus/src/com/premaseem/McDonaldsMealBuilder/MealBuilder.java @@ -0,0 +1,36 @@ +package com.premaseem.McDonaldsMealBuilder; + + +public class MealBuilder { + + public Meal buildVegMeal() { + Meal meal = new Meal(); + Wrap bottle = new Bottle(); + Wrap box = new Box(); + VegBurger veg = new VegBurger(); + veg.warp = box; + Drink milk = new Milk(); + milk.warp=bottle; + + meal.addItem(veg); + meal.addItem(milk); + return meal; + } + + public Meal buildNonVegMeal() { + Meal meal = new Meal(); + Wrap bottle = new Bottle(); + Wrap box = new Box(); + Burger veg = new ChikenBurger(); + veg.warp = box; + Drink milk = new Blood(); + milk.warp=bottle; + + meal.addItem(veg); + meal.addItem(milk); + return meal; + + } +} + + diff --git a/patternBonus/src/com/premaseem/ambulanceBuilder/AmbulanceBuilder.java b/patternBonus/src/com/premaseem/ambulanceBuilder/AmbulanceBuilder.java new file mode 100644 index 0000000..8e82f40 --- /dev/null +++ b/patternBonus/src/com/premaseem/ambulanceBuilder/AmbulanceBuilder.java @@ -0,0 +1,38 @@ +package com.premaseem.ambulanceBuilder; + +public class AmbulanceBuilder { + + Ambulance buildAmbulance(int numberOfWheel, String label){ + Ambulance ambulance=new Ambulance(); + VanFactory vanFactory = new VanFactory(); + ambulance.setVan(vanFactory.getVan(numberOfWheel)); + ambulance.setLabel(label); + return ambulance; + } +} + +class Ambulance{ + Van van; + String label; + + Van getVan() { + return van; + } + void setVan(Van van) { + this.van = van; + } + String getLabel() { + return label; + } + void setLabel(String label) { + this.label = label; + } + + + @Override + public String toString() { + return "Ambulance for " + label + " with number of wheels " + van.noOfWheels; + } + + +} \ No newline at end of file diff --git a/patternBonus/src/com/premaseem/ambulanceBuilder/ClientForAmbulanceBuilder.java b/patternBonus/src/com/premaseem/ambulanceBuilder/ClientForAmbulanceBuilder.java new file mode 100644 index 0000000..851fd02 --- /dev/null +++ b/patternBonus/src/com/premaseem/ambulanceBuilder/ClientForAmbulanceBuilder.java @@ -0,0 +1,49 @@ +package com.premaseem.ambulanceBuilder; + +import java.util.Scanner; + + +public class ClientForAmbulanceBuilder { + + public static void main(String[] args) { + + System.out.println("Welcome to Abmulance Builder project "); + Scanner scan = new Scanner(System.in); + + int repeatRunFlag = 1; + AmbulanceBuilder ambulanceBuilder = new AmbulanceBuilder(); + Ambulance ambulance = null; + while (repeatRunFlag == 1) { + System.out.println("What kind of Ambulance you want ? "); + System.out.println("press 1 for 4 Wheeler"); + System.out.println("press 2 for 6 Wheeler "); + System.out.println("press 3 for 8 Wheeler "); + + int numberOfWheel = scan.nextInt(); + + System.out.println("What kind lable you want for Ambulance ? "); + String label = scan.next(); + + ambulance = ambulanceBuilder.buildAmbulance(numberOfWheel, label); + + + System.out.println("Ambulanc is build " + ambulance); + System.out.println("============================="); + + System.out.println("Press 1 to Repeat .... "); + try { + repeatRunFlag = scan.nextInt(); + } catch (Exception e) { + repeatRunFlag = 0; + } + + } + + System.out.println("\n $$$$$$$$$$$$$$$$$$$$ Thanks by Prem Aseem $$$$$$$$$$$$$$$$$$$$$$ \n "); + System.out.println("\n $$$$$$$$$$$$$$$$$$$$$ www.premaseem.com $$$$$$$$$$$$$$$$$$$$$$ \n "); + + } + + + +} diff --git a/patternBonus/src/com/premaseem/ambulanceBuilder/VanFactory.java b/patternBonus/src/com/premaseem/ambulanceBuilder/VanFactory.java new file mode 100644 index 0000000..213472d --- /dev/null +++ b/patternBonus/src/com/premaseem/ambulanceBuilder/VanFactory.java @@ -0,0 +1,52 @@ +package com.premaseem.ambulanceBuilder; + +public class VanFactory { + + // factory method + Van createVan(int noOfWheel) { + Van van = new Van(); + van.noOfWheels = noOfWheel; + return van; + } + + // simple factory + Van getVan(int noOfWheel) { + + switch (noOfWheel) { + case 1: + return new FourWheelerVan(); + case 2: + return new FourWheelerVan(); + default: + return new EightWheelerVan(); + } + + } + +} + + + + + +class Van { + int noOfWheels; +} + +class SixWheelerVan extends Van { + public SixWheelerVan() { + noOfWheels = 6; + } +} + +class FourWheelerVan extends Van { + public FourWheelerVan() { + noOfWheels = 4; + } +} + +class EightWheelerVan extends Van { + public EightWheelerVan() { + noOfWheels = 8; + } +}