From cf9f87e82f52556bce6a0791e7f2f69615e4f4dc Mon Sep 17 00:00:00 2001 From: Kunwar Date: Sun, 3 Apr 2022 12:02:14 +0530 Subject: [PATCH 1/3] Java Design Patterns --- .../design/creational/prototype/Circle.java | 16 +++++++ .../prototype/PrototypePatternDemo.java | 19 +++++++++ .../creational/prototype/Rectangle.java | 16 +++++++ .../design/creational/prototype/Shape.java | 39 +++++++++++++++++ .../creational/prototype/ShapeCache.java | 42 +++++++++++++++++++ .../design/creational/prototype/Square.java | 16 +++++++ 6 files changed, 148 insertions(+) create mode 100644 com/javadevjournal/design/creational/prototype/Circle.java create mode 100644 com/javadevjournal/design/creational/prototype/PrototypePatternDemo.java create mode 100644 com/javadevjournal/design/creational/prototype/Rectangle.java create mode 100644 com/javadevjournal/design/creational/prototype/Shape.java create mode 100644 com/javadevjournal/design/creational/prototype/ShapeCache.java create mode 100644 com/javadevjournal/design/creational/prototype/Square.java diff --git a/com/javadevjournal/design/creational/prototype/Circle.java b/com/javadevjournal/design/creational/prototype/Circle.java new file mode 100644 index 0000000..5c1694c --- /dev/null +++ b/com/javadevjournal/design/creational/prototype/Circle.java @@ -0,0 +1,16 @@ +package javadevjournal.design.creational.prototype; + +/** + * @author Kunwar + */ +public class Circle extends Shape { + + public Circle() { + type = "Circle"; + } + + @Override + public void draw() { + System.out.println("Circle's draw() method."); + } +} \ No newline at end of file diff --git a/com/javadevjournal/design/creational/prototype/PrototypePatternDemo.java b/com/javadevjournal/design/creational/prototype/PrototypePatternDemo.java new file mode 100644 index 0000000..849f7f1 --- /dev/null +++ b/com/javadevjournal/design/creational/prototype/PrototypePatternDemo.java @@ -0,0 +1,19 @@ +package javadevjournal.design.creational.prototype; + +/** + * @author Kunwar + */ +public class PrototypePatternDemo { + public static void main(String[] args) { + ShapeCache.loadCache(); + + Shape clonedShape = (Shape) ShapeCache.getShape("1"); + System.out.println("Shape : " + clonedShape.getType()); + + Shape clonedShape2 = (Shape) ShapeCache.getShape("2"); + System.out.println("Shape : " + clonedShape2.getType()); + + Shape clonedShape3 = (Shape) ShapeCache.getShape("3"); + System.out.println("Shape : " + clonedShape3.getType()); + } +} \ No newline at end of file diff --git a/com/javadevjournal/design/creational/prototype/Rectangle.java b/com/javadevjournal/design/creational/prototype/Rectangle.java new file mode 100644 index 0000000..5f356a4 --- /dev/null +++ b/com/javadevjournal/design/creational/prototype/Rectangle.java @@ -0,0 +1,16 @@ +package javadevjournal.design.creational.prototype; + +/** + * @author Kunwar + */ +public class Rectangle extends Shape { + + public Rectangle() { + type = "Rectangle"; + } + + @Override + public void draw() { + System.out.println("Rectangle's draw() method."); + } +} \ No newline at end of file diff --git a/com/javadevjournal/design/creational/prototype/Shape.java b/com/javadevjournal/design/creational/prototype/Shape.java new file mode 100644 index 0000000..b8502fa --- /dev/null +++ b/com/javadevjournal/design/creational/prototype/Shape.java @@ -0,0 +1,39 @@ +package javadevjournal.design.creational.prototype; + +/** + * @author Kunwar + */ +public abstract class Shape implements Cloneable { + private String id; + protected String type; + + abstract void draw(); + + public String getType() { + return type; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + /** + * Use Object class's Clone() method to do the cloning. + * + * @return + */ + public Object clone() { + Object cloneObject = null; + try { + cloneObject = super.clone(); + } catch (CloneNotSupportedException e) { + System.out.println("cloning failed"); + e.printStackTrace(); + } + return cloneObject; + } +} \ No newline at end of file diff --git a/com/javadevjournal/design/creational/prototype/ShapeCache.java b/com/javadevjournal/design/creational/prototype/ShapeCache.java new file mode 100644 index 0000000..8c6f43a --- /dev/null +++ b/com/javadevjournal/design/creational/prototype/ShapeCache.java @@ -0,0 +1,42 @@ +package javadevjournal.design.creational.prototype; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Kunwar + */ + +public class ShapeCache { + private static Map shapeMap = new HashMap(); + + /** + * Return cloned object of Shape class implementing classes. + * + * @param shapeId + * @return + */ + public static Shape getShape(String shapeId) { + Shape toBeClonedShape = shapeMap.get(shapeId); + return (Shape) toBeClonedShape.clone(); + } + + + /** + * In real-world applications, the loading of details will be from a Database. + * We are using a HaspMap to demonstrate the same behavior. + */ + public static void loadCache() { + Circle circle = new Circle(); + circle.setId("1"); + shapeMap.put(circle.getId(), circle); + + Square square = new Square(); + square.setId("2"); + shapeMap.put(square.getId(), square); + + Rectangle rectangle = new Rectangle(); + rectangle.setId("3"); + shapeMap.put(rectangle.getId(), rectangle); + } +} \ No newline at end of file diff --git a/com/javadevjournal/design/creational/prototype/Square.java b/com/javadevjournal/design/creational/prototype/Square.java new file mode 100644 index 0000000..195953d --- /dev/null +++ b/com/javadevjournal/design/creational/prototype/Square.java @@ -0,0 +1,16 @@ +package javadevjournal.design.creational.prototype; + +/** + * @author Kunwar + */ +public class Square extends Shape { + + public Square() { + type = "Square"; + } + + @Override + public void draw() { + System.out.println("Square's draw() method."); + } +} \ No newline at end of file From 03b7e798e9cee324acc5ddff7515b2b82b166e33 Mon Sep 17 00:00:00 2001 From: Kunwar Date: Sat, 9 Apr 2022 21:20:17 +0530 Subject: [PATCH 2/3] Java Design Patterns --- .../design/structural/decorator/Circle.java | 12 ++++++++ .../decorator/DecoratorPatternDemo.java | 29 +++++++++++++++++++ .../structural/decorator/Rectangle.java | 12 ++++++++ .../decorator/RedShapeDecorator.java | 27 +++++++++++++++++ .../design/structural/decorator/Shape.java | 8 +++++ .../structural/decorator/ShapeDecorator.java | 19 ++++++++++++ 6 files changed, 107 insertions(+) create mode 100644 com/javadevjournal/design/structural/decorator/Circle.java create mode 100644 com/javadevjournal/design/structural/decorator/DecoratorPatternDemo.java create mode 100644 com/javadevjournal/design/structural/decorator/Rectangle.java create mode 100644 com/javadevjournal/design/structural/decorator/RedShapeDecorator.java create mode 100644 com/javadevjournal/design/structural/decorator/Shape.java create mode 100644 com/javadevjournal/design/structural/decorator/ShapeDecorator.java diff --git a/com/javadevjournal/design/structural/decorator/Circle.java b/com/javadevjournal/design/structural/decorator/Circle.java new file mode 100644 index 0000000..84248dc --- /dev/null +++ b/com/javadevjournal/design/structural/decorator/Circle.java @@ -0,0 +1,12 @@ +package javadevjournal.design.structural.decorator; + +/** + * @author Kunwar + */ +public class Circle implements Shape { + + @Override + public void drawShape() { + System.out.println("The shape is: Circle"); + } +} diff --git a/com/javadevjournal/design/structural/decorator/DecoratorPatternDemo.java b/com/javadevjournal/design/structural/decorator/DecoratorPatternDemo.java new file mode 100644 index 0000000..95140b6 --- /dev/null +++ b/com/javadevjournal/design/structural/decorator/DecoratorPatternDemo.java @@ -0,0 +1,29 @@ +package javadevjournal.design.structural.decorator;// DecoratorPatternDemo.java + +/** + * @author Kunwar + */ +public class DecoratorPatternDemo { + + public static void main(String[] args) { + // Creating objects of Shape interface + Shape circle = new Circle(); + Shape rectangle = new Rectangle(); + + // Creating objects of decorated classes + Shape redCircle = new RedShapeDecorator(new Circle()); + Shape redRectangle = new RedShapeDecorator(new Rectangle()); + + System.out.println("Circle with normal fill"); + circle.drawShape(); + + System.out.println("Rectangle with normal fill"); + rectangle.drawShape(); + + System.out.println("\nCircle of red fill"); + redCircle.drawShape(); + + System.out.println("\nRectangle of red fill"); + redRectangle.drawShape(); + } +} diff --git a/com/javadevjournal/design/structural/decorator/Rectangle.java b/com/javadevjournal/design/structural/decorator/Rectangle.java new file mode 100644 index 0000000..1b02282 --- /dev/null +++ b/com/javadevjournal/design/structural/decorator/Rectangle.java @@ -0,0 +1,12 @@ +package javadevjournal.design.structural.decorator;// Class 1 + +/** + * @author Kunwar + */ +public class Rectangle implements Shape { + + @Override + public void drawShape() { + System.out.println("The shape is: Rectangle"); + } +} diff --git a/com/javadevjournal/design/structural/decorator/RedShapeDecorator.java b/com/javadevjournal/design/structural/decorator/RedShapeDecorator.java new file mode 100644 index 0000000..8a49c58 --- /dev/null +++ b/com/javadevjournal/design/structural/decorator/RedShapeDecorator.java @@ -0,0 +1,27 @@ +package javadevjournal.design.structural.decorator; + +/** + * @author Kunwar + */ +public class RedShapeDecorator extends ShapeDecorator { + + public RedShapeDecorator(Shape decoratedShape) { + super(decoratedShape); + } + + @Override + public void drawShape() { + decoratedShape.drawShape(); + //additional method to change the behavior of the shape object + shapeFill(decoratedShape); + } + + /** + * This method will change the behavior of the shape object at runtime. + * + * @param decoratedShape + */ + private void shapeFill(Shape decoratedShape) { + System.out.println("Shape Fill color: Red"); + } +} diff --git a/com/javadevjournal/design/structural/decorator/Shape.java b/com/javadevjournal/design/structural/decorator/Shape.java new file mode 100644 index 0000000..ba2fd3d --- /dev/null +++ b/com/javadevjournal/design/structural/decorator/Shape.java @@ -0,0 +1,8 @@ +package javadevjournal.design.structural.decorator; + +/** + * @author Kunwar + */ +public interface Shape { + void drawShape(); +} diff --git a/com/javadevjournal/design/structural/decorator/ShapeDecorator.java b/com/javadevjournal/design/structural/decorator/ShapeDecorator.java new file mode 100644 index 0000000..3be7a9c --- /dev/null +++ b/com/javadevjournal/design/structural/decorator/ShapeDecorator.java @@ -0,0 +1,19 @@ +package javadevjournal.design.structural.decorator; + +/** + * @author Kunwar + */ +public abstract class ShapeDecorator implements Shape { + + //protected object of Shape Interface. + protected Shape decoratedShape; + + public ShapeDecorator(Shape decoratedShape) { + this.decoratedShape = decoratedShape; + } + + //calling the drawShape method on decoratedShape + public void drawShape() { + decoratedShape.drawShape(); + } +} From c83d39750b26d16ef3a2747bc7c1dd8d4bf80b4b Mon Sep 17 00:00:00 2001 From: Kunwar Date: Sun, 17 Apr 2022 13:05:10 +0530 Subject: [PATCH 3/3] Java Design Patterns --- .../facade/FacadePatternClient.java | 46 +++++++++++++++++++ .../design/structural/facade/IMobileShop.java | 16 +++++++ .../design/structural/facade/Iphone.java | 16 +++++++ .../design/structural/facade/Nokia.java | 16 +++++++ .../design/structural/facade/Samsung.java | 16 +++++++ .../design/structural/facade/ShopKeeper.java | 34 ++++++++++++++ 6 files changed, 144 insertions(+) create mode 100644 com/javadevjournal/design/structural/facade/FacadePatternClient.java create mode 100644 com/javadevjournal/design/structural/facade/IMobileShop.java create mode 100644 com/javadevjournal/design/structural/facade/Iphone.java create mode 100644 com/javadevjournal/design/structural/facade/Nokia.java create mode 100644 com/javadevjournal/design/structural/facade/Samsung.java create mode 100644 com/javadevjournal/design/structural/facade/ShopKeeper.java diff --git a/com/javadevjournal/design/structural/facade/FacadePatternClient.java b/com/javadevjournal/design/structural/facade/FacadePatternClient.java new file mode 100644 index 0000000..3263394 --- /dev/null +++ b/com/javadevjournal/design/structural/facade/FacadePatternClient.java @@ -0,0 +1,46 @@ +package javadevjournal.design.structural.facade; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * @author Kunwar + */ +public class FacadePatternClient { + private static int choice; + + public static void main(String args[]) throws NumberFormatException, IOException { + do { + System.out.print("========= Mobile Shop ============ \n"); + System.out.print("1. IPHONE. \n"); + System.out.print("2. SAMSUNG. \n"); + System.out.print("3. NOKIA. \n"); + System.out.print("4. Exit. \n"); + System.out.print("Enter your choice: "); + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + choice = Integer.parseInt(br.readLine()); + ShopKeeper shopKeeper = new ShopKeeper(); + + switch (choice) { + case 1: { + shopKeeper.iphonePhoneSale(); + } + break; + case 2: { + shopKeeper.samsungPhoneSale(); + } + break; + case 3: { + shopKeeper.nokiaPhoneSale(); + } + break; + default: { + System.out.println("Nothing You purchased"); + } + return; + } + } while (choice != 4); + } +} \ No newline at end of file diff --git a/com/javadevjournal/design/structural/facade/IMobileShop.java b/com/javadevjournal/design/structural/facade/IMobileShop.java new file mode 100644 index 0000000..222d3f7 --- /dev/null +++ b/com/javadevjournal/design/structural/facade/IMobileShop.java @@ -0,0 +1,16 @@ +package javadevjournal.design.structural.facade; + +/** + * @author Kunwar + */ +public interface IMobileShop { + /** + * Mobile Model Number + */ + public void getMobileModelNumber(); + + /** + * Mobile Price + */ + public void getMobilePrice(); +} \ No newline at end of file diff --git a/com/javadevjournal/design/structural/facade/Iphone.java b/com/javadevjournal/design/structural/facade/Iphone.java new file mode 100644 index 0000000..2ab5eed --- /dev/null +++ b/com/javadevjournal/design/structural/facade/Iphone.java @@ -0,0 +1,16 @@ +package javadevjournal.design.structural.facade; + +/** + * @author Kunwar + */ +public class Iphone implements IMobileShop { + @Override + public void getMobileModelNumber() { + System.out.println("The model is: IPhone 13"); + } + + @Override + public void getMobilePrice() { + System.out.println("The price is: 75000INR "); + } +} \ No newline at end of file diff --git a/com/javadevjournal/design/structural/facade/Nokia.java b/com/javadevjournal/design/structural/facade/Nokia.java new file mode 100644 index 0000000..cfcf84c --- /dev/null +++ b/com/javadevjournal/design/structural/facade/Nokia.java @@ -0,0 +1,16 @@ +package javadevjournal.design.structural.facade; + +/** + * @author Kunwar + */ +public class Nokia implements IMobileShop { + @Override + public void getMobileModelNumber() { + System.out.println("The model is: Nokia 1100"); + } + + @Override + public void getMobilePrice() { + System.out.println("The price is: 1500INR "); + } +} \ No newline at end of file diff --git a/com/javadevjournal/design/structural/facade/Samsung.java b/com/javadevjournal/design/structural/facade/Samsung.java new file mode 100644 index 0000000..34111dd --- /dev/null +++ b/com/javadevjournal/design/structural/facade/Samsung.java @@ -0,0 +1,16 @@ +package javadevjournal.design.structural.facade; + +/** + * @author Kunwar + */ +public class Samsung implements IMobileShop { + @Override + public void getMobileModelNumber() { + System.out.println("The model is: Galaxy 11"); + } + + @Override + public void getMobilePrice() { + System.out.println("The price is: 85000INR "); + } +} \ No newline at end of file diff --git a/com/javadevjournal/design/structural/facade/ShopKeeper.java b/com/javadevjournal/design/structural/facade/ShopKeeper.java new file mode 100644 index 0000000..50ad174 --- /dev/null +++ b/com/javadevjournal/design/structural/facade/ShopKeeper.java @@ -0,0 +1,34 @@ +package javadevjournal.design.structural.facade; + +/** + * @author Kunwar + */ +public class ShopKeeper { + private IMobileShop iphone; + private IMobileShop samsung; + private IMobileShop nokia; + + /** + * no args constructor + */ + public ShopKeeper() { + iphone = new Iphone(); + samsung = new Samsung(); + nokia = new Nokia(); + } + + public void iphonePhoneSale() { + iphone.getMobileModelNumber(); + iphone.getMobilePrice(); + } + + public void samsungPhoneSale() { + samsung.getMobileModelNumber(); + samsung.getMobilePrice(); + } + + public void nokiaPhoneSale() { + nokia.getMobileModelNumber(); + nokia.getMobilePrice(); + } +} \ No newline at end of file