From f7e88df2244792e6c55ddf6f5d1c840f5eca8a6a Mon Sep 17 00:00:00 2001 From: Kunwar Date: Fri, 4 Mar 2022 08:15:52 +0530 Subject: [PATCH] Java Design Patterns --- .../abstractfactory/AbstractFactory.java | 8 ++ .../abstractfactory/AbstractFactoryDemo.java | 29 +++++ .../abstractfactory/FactoryOfFactory.java | 14 +++ .../creational/abstractfactory/Rectangle.java | 11 ++ .../abstractfactory/RoundedRectangle.java | 11 ++ .../abstractfactory/RoundedShapeFactory.java | 16 +++ .../abstractfactory/RoundedSquare.java | 11 ++ .../creational/abstractfactory/Shape.java | 8 ++ .../abstractfactory/ShapeFactory.java | 16 +++ .../creational/abstractfactory/Square.java | 11 ++ .../example2/AbstractFactory.java | 8 ++ .../example2/AbstractFactoryPatternDemo.java | 19 +++ .../example2/AndroidMobileFactory.java | 18 +++ .../example2/AppleMobileFactory.java | 14 +++ .../abstractfactory/example2/IMobile.java | 8 ++ .../abstractfactory/example2/Iphone.java | 11 ++ .../abstractfactory/example2/Lava.java | 11 ++ .../example2/MpbileFactoryProducer.java | 15 +++ .../abstractfactory/example2/OnePlus.java | 11 ++ .../abstractfactory/example2/Sony.java | 11 ++ .../builder/BuilderPatternDemo.java | 26 ++++ .../creational/builder/Computer.java | 116 ++++++++++++++++++ .../creational/factory/Circle.java | 11 ++ .../factory/FactoryPatternDemo.java | 23 ++++ .../creational/factory/Rectangle.java | 11 ++ .../creational/factory/Shape.java | 8 ++ .../creational/factory/ShapeFactory.java | 28 +++++ .../creational/factory/Square.java | 11 ++ .../factory/banking/BankAccount.java | 8 ++ .../factory/banking/BankAccountFactory.java | 20 +++ .../creational/factory/banking/Branch.java | 22 ++++ .../factory/banking/BusinessAccount.java | 11 ++ .../factory/banking/CheckingAccount.java | 11 ++ .../factory/banking/PersonalAccount.java | 11 ++ .../creational/singleton/Singleton.java | 18 +++ .../singleton/SingletonMultiThreaded.java | 23 ++++ .../singleton/SingletonPatternDemo.java | 24 ++++ .../creational/singleton/Thread1.java | 9 ++ .../creational/singleton/Thread2.java | 9 ++ .../creational/singleton/Thread3.java | 9 ++ .../BreakSingletonUsingReflection.java | 27 ++++ .../singleton/breakit/Singleton.java | 10 ++ .../adapter/AdapterPatternDemo.java | 14 +++ .../adapter/AdvancedMediaPlayer.java | 9 ++ .../structural/adapter/AudioPlayer.java | 22 ++++ .../structural/adapter/MediaAdapter.java | 28 +++++ .../structural/adapter/MediaPlayer.java | 8 ++ .../structural/adapter/Mp4MusicPlayer.java | 17 +++ .../structural/adapter/VlcMusicPlayer.java | 16 +++ 49 files changed, 821 insertions(+) create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/AbstractFactory.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/AbstractFactoryDemo.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/FactoryOfFactory.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/Rectangle.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/RoundedRectangle.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/RoundedShapeFactory.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/RoundedSquare.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/Shape.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/ShapeFactory.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/Square.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/example2/AbstractFactory.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/example2/AbstractFactoryPatternDemo.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/example2/AndroidMobileFactory.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/example2/AppleMobileFactory.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/example2/IMobile.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/example2/Iphone.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/example2/Lava.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/example2/MpbileFactoryProducer.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/example2/OnePlus.java create mode 100644 com/javadevjournal/designpatterns/creational/abstractfactory/example2/Sony.java create mode 100644 com/javadevjournal/designpatterns/creational/builder/BuilderPatternDemo.java create mode 100644 com/javadevjournal/designpatterns/creational/builder/Computer.java create mode 100644 com/javadevjournal/designpatterns/creational/factory/Circle.java create mode 100644 com/javadevjournal/designpatterns/creational/factory/FactoryPatternDemo.java create mode 100644 com/javadevjournal/designpatterns/creational/factory/Rectangle.java create mode 100644 com/javadevjournal/designpatterns/creational/factory/Shape.java create mode 100644 com/javadevjournal/designpatterns/creational/factory/ShapeFactory.java create mode 100644 com/javadevjournal/designpatterns/creational/factory/Square.java create mode 100644 com/javadevjournal/designpatterns/creational/factory/banking/BankAccount.java create mode 100644 com/javadevjournal/designpatterns/creational/factory/banking/BankAccountFactory.java create mode 100644 com/javadevjournal/designpatterns/creational/factory/banking/Branch.java create mode 100644 com/javadevjournal/designpatterns/creational/factory/banking/BusinessAccount.java create mode 100644 com/javadevjournal/designpatterns/creational/factory/banking/CheckingAccount.java create mode 100644 com/javadevjournal/designpatterns/creational/factory/banking/PersonalAccount.java create mode 100644 com/javadevjournal/designpatterns/creational/singleton/Singleton.java create mode 100644 com/javadevjournal/designpatterns/creational/singleton/SingletonMultiThreaded.java create mode 100644 com/javadevjournal/designpatterns/creational/singleton/SingletonPatternDemo.java create mode 100644 com/javadevjournal/designpatterns/creational/singleton/Thread1.java create mode 100644 com/javadevjournal/designpatterns/creational/singleton/Thread2.java create mode 100644 com/javadevjournal/designpatterns/creational/singleton/Thread3.java create mode 100644 com/javadevjournal/designpatterns/creational/singleton/breakit/BreakSingletonUsingReflection.java create mode 100644 com/javadevjournal/designpatterns/creational/singleton/breakit/Singleton.java create mode 100644 com/javadevjournal/designpatterns/structural/adapter/AdapterPatternDemo.java create mode 100644 com/javadevjournal/designpatterns/structural/adapter/AdvancedMediaPlayer.java create mode 100644 com/javadevjournal/designpatterns/structural/adapter/AudioPlayer.java create mode 100644 com/javadevjournal/designpatterns/structural/adapter/MediaAdapter.java create mode 100644 com/javadevjournal/designpatterns/structural/adapter/MediaPlayer.java create mode 100644 com/javadevjournal/designpatterns/structural/adapter/Mp4MusicPlayer.java create mode 100644 com/javadevjournal/designpatterns/structural/adapter/VlcMusicPlayer.java diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/AbstractFactory.java b/com/javadevjournal/designpatterns/creational/abstractfactory/AbstractFactory.java new file mode 100644 index 0000000..4103b8f --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/AbstractFactory.java @@ -0,0 +1,8 @@ +package javadevjournal.designpatterns.creational.abstractfactory; + +/** + * @author Kunwar + */ +public abstract class AbstractFactory { + abstract Shape getShape(String shapeType) ; +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/AbstractFactoryDemo.java b/com/javadevjournal/designpatterns/creational/abstractfactory/AbstractFactoryDemo.java new file mode 100644 index 0000000..fd0fd1e --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/AbstractFactoryDemo.java @@ -0,0 +1,29 @@ +package javadevjournal.designpatterns.creational.abstractfactory; + +/** + * @author Kunwar + */ +public class AbstractFactoryDemo { + public static void main(String[] args) { + /* get shape factory */ + AbstractFactory shapeFactory = FactoryOfFactory.getFactory(false); + /* get an object of Shape Rectangle */ + Shape shape1 = shapeFactory.getShape("RECTANGLE"); + /* call draw method of Shape Rectangle */ + shape1.drawShape(); + /* get an object of Shape Square */ + Shape shape2 = shapeFactory.getShape("SQUARE"); + /* call draw method of Shape Square */ + shape2.drawShape(); + /* get rounded shape factory */ + AbstractFactory roundShapeFactory = FactoryOfFactory.getFactory(true); + /* get an object of Shape Rectangle */ + Shape shape3 = roundShapeFactory.getShape("RECTANGLE"); + /* call draw method of Shape Rectangle */ + shape3.drawShape(); + /* get an object of Shape Square */ + Shape shape4 = roundShapeFactory.getShape("SQUARE"); + /* call draw method of Shape Square */ + shape4.drawShape(); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/FactoryOfFactory.java b/com/javadevjournal/designpatterns/creational/abstractfactory/FactoryOfFactory.java new file mode 100644 index 0000000..9a1e07a --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/FactoryOfFactory.java @@ -0,0 +1,14 @@ +package javadevjournal.designpatterns.creational.abstractfactory; + +/** + * @author Kunwar + */ +public class FactoryOfFactory { + public static AbstractFactory getFactory(boolean rounded){ + if(rounded){ + return new RoundedShapeFactory(); + }else{ + return new ShapeFactory(); + } + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/Rectangle.java b/com/javadevjournal/designpatterns/creational/abstractfactory/Rectangle.java new file mode 100644 index 0000000..9003bad --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/Rectangle.java @@ -0,0 +1,11 @@ +package javadevjournal.designpatterns.creational.abstractfactory; + +/** + * @author Kunwar + */ +public class Rectangle implements Shape { + @Override + public void drawShape() { + System.out.println("Inside Rectangle::draw() method."); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/RoundedRectangle.java b/com/javadevjournal/designpatterns/creational/abstractfactory/RoundedRectangle.java new file mode 100644 index 0000000..0feebc7 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/RoundedRectangle.java @@ -0,0 +1,11 @@ +package javadevjournal.designpatterns.creational.abstractfactory; + +/** + * @author Kunwar + */ +public class RoundedRectangle implements Shape { + @Override + public void drawShape() { + System.out.println("Inside RoundedRectangle::draw() method."); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/RoundedShapeFactory.java b/com/javadevjournal/designpatterns/creational/abstractfactory/RoundedShapeFactory.java new file mode 100644 index 0000000..34db427 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/RoundedShapeFactory.java @@ -0,0 +1,16 @@ +package javadevjournal.designpatterns.creational.abstractfactory; + +/** + * @author Kunwar + */ +public class RoundedShapeFactory extends AbstractFactory { + @Override + public Shape getShape(String shapeType){ + if(shapeType.equalsIgnoreCase("RECTANGLE")){ + return new RoundedRectangle(); + }else if(shapeType.equalsIgnoreCase("SQUARE")){ + return new RoundedSquare(); + } + return null; + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/RoundedSquare.java b/com/javadevjournal/designpatterns/creational/abstractfactory/RoundedSquare.java new file mode 100644 index 0000000..c49065a --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/RoundedSquare.java @@ -0,0 +1,11 @@ +package javadevjournal.designpatterns.creational.abstractfactory; + +/** + * @author Kunwar + */ +public class RoundedSquare implements Shape { + @Override + public void drawShape() { + System.out.println("Inside RoundedSquare::draw() method."); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/Shape.java b/com/javadevjournal/designpatterns/creational/abstractfactory/Shape.java new file mode 100644 index 0000000..5d0ab4f --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/Shape.java @@ -0,0 +1,8 @@ +package javadevjournal.designpatterns.creational.abstractfactory; + +/** + * @author Kunwar + */ +public interface Shape { + void drawShape(); +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/ShapeFactory.java b/com/javadevjournal/designpatterns/creational/abstractfactory/ShapeFactory.java new file mode 100644 index 0000000..e9ad1a3 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/ShapeFactory.java @@ -0,0 +1,16 @@ +package javadevjournal.designpatterns.creational.abstractfactory; + +/** + * @author Kunwar + */ +public class ShapeFactory extends AbstractFactory { + @Override + public Shape getShape(String shapeType){ + if(shapeType.equalsIgnoreCase("RECTANGLE")){ + return new Rectangle(); + }else if(shapeType.equalsIgnoreCase("SQUARE")){ + return new Square(); + } + return null; + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/Square.java b/com/javadevjournal/designpatterns/creational/abstractfactory/Square.java new file mode 100644 index 0000000..78904e8 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/Square.java @@ -0,0 +1,11 @@ +package javadevjournal.designpatterns.creational.abstractfactory; + +/** + * @author Kunwar + */ +public class Square implements Shape { + @Override + public void drawShape() { + System.out.println("Inside Square::draw() method."); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/example2/AbstractFactory.java b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/AbstractFactory.java new file mode 100644 index 0000000..8c6549d --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/AbstractFactory.java @@ -0,0 +1,8 @@ +package javadevjournal.designpatterns.creational.abstractfactory.example2; + +/** + * Abstract Factory - Factory of Factories + */ +public abstract class AbstractFactory{ + abstract IMobile getMobile(String mobileModel) ; +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/example2/AbstractFactoryPatternDemo.java b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/AbstractFactoryPatternDemo.java new file mode 100644 index 0000000..be08175 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/AbstractFactoryPatternDemo.java @@ -0,0 +1,19 @@ +package javadevjournal.designpatterns.creational.abstractfactory.example2; + +/** + * Client Class + */ +public class AbstractFactoryPatternDemo{ + public static void main(String[] args){ + AbstractFactory abstractFactory1 = MpbileFactoryProducer.getFactory(false); + IMobile onePlus = abstractFactory1.getMobile("Oneplus"); + onePlus.brandName(); + IMobile sony = abstractFactory1.getMobile("Sony"); + sony.brandName(); + IMobile lava = abstractFactory1.getMobile("Lava"); + lava.brandName(); + AbstractFactory abstractFactory2 = MpbileFactoryProducer.getFactory(true); + IMobile iphone = abstractFactory2.getMobile("iphone"); + iphone.brandName(); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/example2/AndroidMobileFactory.java b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/AndroidMobileFactory.java new file mode 100644 index 0000000..ccd9558 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/AndroidMobileFactory.java @@ -0,0 +1,18 @@ +package javadevjournal.designpatterns.creational.abstractfactory.example2; + +/** + * Android Mobile Factory + */ +public class AndroidMobileFactory extends AbstractFactory { + @Override + public IMobile getMobile(String mobileModel){ + if(mobileModel.equalsIgnoreCase("Oneplus")){ + return new OnePlus(); + }else if(mobileModel.equalsIgnoreCase("Sony")){ + return new Sony(); + }else if(mobileModel.equalsIgnoreCase("Lava")){ + return new Lava(); + } + return null; + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/example2/AppleMobileFactory.java b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/AppleMobileFactory.java new file mode 100644 index 0000000..83df9f9 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/AppleMobileFactory.java @@ -0,0 +1,14 @@ +package javadevjournal.designpatterns.creational.abstractfactory.example2; + +/** + * Apple Mobile Factory + */ +public class AppleMobileFactory extends AbstractFactory{ + @Override + public IMobile getMobile(String mobileModel){ + if(mobileModel.equalsIgnoreCase("iphone")){ + return new Iphone(); + } + return null; + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/example2/IMobile.java b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/IMobile.java new file mode 100644 index 0000000..688a170 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/IMobile.java @@ -0,0 +1,8 @@ +package javadevjournal.designpatterns.creational.abstractfactory.example2; + +/** + * Mobile + */ +public interface IMobile { + void brandName(); +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/example2/Iphone.java b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/Iphone.java new file mode 100644 index 0000000..84cea06 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/Iphone.java @@ -0,0 +1,11 @@ +package javadevjournal.designpatterns.creational.abstractfactory.example2; + +/** + * Iphone Mobile + */ +public class Iphone implements IMobile { + @Override + public void brandName() { + System.out.println("The brand name is Iphone"); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/example2/Lava.java b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/Lava.java new file mode 100644 index 0000000..906a8c2 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/Lava.java @@ -0,0 +1,11 @@ +package javadevjournal.designpatterns.creational.abstractfactory.example2; + +/** + * Nokia Mobile Concrete Class + */ +public class Lava implements IMobile { + @Override + public void brandName() { + System.out.println("The brand name is Lava"); + } +} diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/example2/MpbileFactoryProducer.java b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/MpbileFactoryProducer.java new file mode 100644 index 0000000..9cf1350 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/MpbileFactoryProducer.java @@ -0,0 +1,15 @@ +package javadevjournal.designpatterns.creational.abstractfactory.example2; + +/** + * Factory Producer + */ +public class MpbileFactoryProducer { + public static AbstractFactory getFactory(boolean isApple){ + if(isApple){ + return new AppleMobileFactory(); + }else{ + return new AndroidMobileFactory(); + } + } +} + \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/example2/OnePlus.java b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/OnePlus.java new file mode 100644 index 0000000..57a586b --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/OnePlus.java @@ -0,0 +1,11 @@ +package javadevjournal.designpatterns.creational.abstractfactory.example2; + +/** + * OnePlus Mobile + */ +public class OnePlus implements IMobile { + @Override + public void brandName() { + System.out.println("The brand name is OnePlus"); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/abstractfactory/example2/Sony.java b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/Sony.java new file mode 100644 index 0000000..cbcad3d --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/abstractfactory/example2/Sony.java @@ -0,0 +1,11 @@ +package javadevjournal.designpatterns.creational.abstractfactory.example2; + +/** + * Sony Mobile + */ +public class Sony implements IMobile { + @Override + public void brandName() { + System.out.println("The brand name is Sony"); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/builder/BuilderPatternDemo.java b/com/javadevjournal/designpatterns/creational/builder/BuilderPatternDemo.java new file mode 100644 index 0000000..26c7c3f --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/builder/BuilderPatternDemo.java @@ -0,0 +1,26 @@ +package javadevjournal.designpatterns.creational.builder; + +/** + * @author Kunwar + * Builder Pattern Client Class + * Create Computer object with mandatory and optional properties + */ +public class BuilderPatternDemo { + public static void main(String[] args) { + + Computer model1 = new Computer.ComputerBuilder( + "1 TB", "16 GB","15.6").setBluetoothEnabled(true) + .setGraphicsCardEnabled(true).setTouchScreenEnabled(true).setWebCamEnabled(true).build(); + System.out.println("model1: " + model1.toString()); + + Computer model2 = new Computer.ComputerBuilder( + "256 GB", "8 GB","14.6").setBluetoothEnabled(true) + .setGraphicsCardEnabled(true).build(); + System.out.println("model2: "+model2.toString()); + + + Computer model3 = new Computer.ComputerBuilder( + "128 GB", "4 GB","13.6").build(); + System.out.println("model3: "+model3.toString()); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/builder/Computer.java b/com/javadevjournal/designpatterns/creational/builder/Computer.java new file mode 100644 index 0000000..a060874 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/builder/Computer.java @@ -0,0 +1,116 @@ +package javadevjournal.designpatterns.creational.builder; + +/** + * @author Kunwar + * Product Class + * Builder Pattern Class + */ +public class Computer { + //required parameters + private String HDD; + private String RAM; + private String screenSize; + + //optional parameters + private boolean isGraphicsCardEnabled; + private boolean isBluetoothEnabled; + private boolean isWebCamEnabled; + private boolean isTouchScreenEnabled; + + public String getHDD() { + return HDD; + } + + public String getRAM() { + return RAM; + } + + public String getScreenSize() { + return screenSize; + } + + public boolean isGraphicsCardEnabled() { + return isGraphicsCardEnabled; + } + + public boolean isBluetoothEnabled() { + return isBluetoothEnabled; + } + + public boolean isWebCamEnabled() { + return isWebCamEnabled; + } + + public boolean isTouchScreenEnabled() { + return isTouchScreenEnabled; + } + + private Computer(ComputerBuilder builder) { + this.HDD=builder.HDD; + this.RAM=builder.RAM; + this.screenSize=builder.screenSize; + this.isGraphicsCardEnabled=builder.isGraphicsCardEnabled; + this.isBluetoothEnabled=builder.isBluetoothEnabled; + this.isTouchScreenEnabled=builder.isTouchScreenEnabled; + this.isWebCamEnabled=builder.isWebCamEnabled; + this.isWebCamEnabled=builder.isWebCamEnabled; + } + + //Builder Class + public static class ComputerBuilder{ + + // required parameters + private String HDD; + private String RAM; + private String screenSize; + + // optional parameters + private boolean isGraphicsCardEnabled; + private boolean isBluetoothEnabled; + private boolean isWebCamEnabled; + private boolean isTouchScreenEnabled; + + public ComputerBuilder(String hdd, String ram, String screenSize){ + this.HDD=hdd; + this.RAM=ram; + this.screenSize=screenSize; + } + + public ComputerBuilder setGraphicsCardEnabled(boolean isGraphicsCardEnabled) { + this.isGraphicsCardEnabled = isGraphicsCardEnabled; + return this; + } + + public ComputerBuilder setBluetoothEnabled(boolean isBluetoothEnabled) { + this.isBluetoothEnabled = isBluetoothEnabled; + return this; + } + + public ComputerBuilder setWebCamEnabled(boolean webCamEnabled) { + isWebCamEnabled = webCamEnabled; + return this; + } + + public ComputerBuilder setTouchScreenEnabled(boolean touchScreenEnabled) { + isTouchScreenEnabled = touchScreenEnabled; + return this; + } + + public Computer build(){ + return new Computer(this); + } + } + + @Override + public String toString() { + return "Computer{" + + "HDD='" + HDD + '\'' + + ", RAM='" + RAM + '\'' + + ", screenSize='" + screenSize + '\'' + + ", isGraphicsCardEnabled=" + isGraphicsCardEnabled + + ", isBluetoothEnabled=" + isBluetoothEnabled + + ", isWebCamEnabled=" + isWebCamEnabled + + ", isTouchScreenEnabled=" + isTouchScreenEnabled + + '}'; + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/factory/Circle.java b/com/javadevjournal/designpatterns/creational/factory/Circle.java new file mode 100644 index 0000000..60a25b5 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/factory/Circle.java @@ -0,0 +1,11 @@ +package javadevjournal.designpatterns.creational.factory; + +/** + * @author Kunwar + */ +public class Circle implements Shape { + @Override + public void drawShape() { + System.out.println("Inside Circle::drawShape() method."); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/factory/FactoryPatternDemo.java b/com/javadevjournal/designpatterns/creational/factory/FactoryPatternDemo.java new file mode 100644 index 0000000..bfe7a89 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/factory/FactoryPatternDemo.java @@ -0,0 +1,23 @@ +package javadevjournal.designpatterns.creational.factory; + +/** + * @author Kunwar + * Factory Pattern Demo + */ +public class FactoryPatternDemo { + public static void main(String[] args) { + ShapeFactory shapeFactory = new ShapeFactory(); + + /* get an object of Circle Class and call its drawShape method. */ + Shape shape1 = shapeFactory.getShape("CIRCLE"); + shape1.drawShape(); + + /* get an object of Rectangle Class and call its drawShape method. */ + Shape shape2 = shapeFactory.getShape("RECTANGLE"); + shape2.drawShape(); + + /* get an object of Square Class and call its drawShape method. */ + Shape shape3 = shapeFactory.getShape("SQUARE"); + shape3.drawShape(); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/factory/Rectangle.java b/com/javadevjournal/designpatterns/creational/factory/Rectangle.java new file mode 100644 index 0000000..26a6c55 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/factory/Rectangle.java @@ -0,0 +1,11 @@ +package javadevjournal.designpatterns.creational.factory; + +/** + * @author Kunwar + */ +public class Rectangle implements Shape { + @Override + public void drawShape() { + System.out.println("Inside Rectangle::drawShape() method."); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/factory/Shape.java b/com/javadevjournal/designpatterns/creational/factory/Shape.java new file mode 100644 index 0000000..759db20 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/factory/Shape.java @@ -0,0 +1,8 @@ +package javadevjournal.designpatterns.creational.factory; + +/** + * @author Kunwar + */ +public interface Shape { + void drawShape(); +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/factory/ShapeFactory.java b/com/javadevjournal/designpatterns/creational/factory/ShapeFactory.java new file mode 100644 index 0000000..367263b --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/factory/ShapeFactory.java @@ -0,0 +1,28 @@ +package javadevjournal.designpatterns.creational.factory; + +/** + * @author Kunwar + * Factory Pattern Implementation here + */ +public class ShapeFactory { + /** + * get the shapeType from caller and decide the correct implementation class + * @param shapeType + * @return + */ + public Shape getShape(String shapeType){ + if(shapeType == null){ + return null; + } + if(shapeType.equalsIgnoreCase("CIRCLE")){ + return new Circle(); + + } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ + return new Rectangle(); + + } else if(shapeType.equalsIgnoreCase("SQUARE")){ + return new Square(); + } + return null; + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/factory/Square.java b/com/javadevjournal/designpatterns/creational/factory/Square.java new file mode 100644 index 0000000..6749cb9 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/factory/Square.java @@ -0,0 +1,11 @@ +package javadevjournal.designpatterns.creational.factory; + +/** + * @author Kunwar + */ +public class Square implements Shape { + @Override + public void drawShape() { + System.out.println("Inside Square::drawShape() method."); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/factory/banking/BankAccount.java b/com/javadevjournal/designpatterns/creational/factory/banking/BankAccount.java new file mode 100644 index 0000000..bdf9e4f --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/factory/banking/BankAccount.java @@ -0,0 +1,8 @@ +package javadevjournal.designpatterns.creational.factory.banking; + +/** + * @author Kunwar + */ +public interface BankAccount { + public void registerAccount(); +} diff --git a/com/javadevjournal/designpatterns/creational/factory/banking/BankAccountFactory.java b/com/javadevjournal/designpatterns/creational/factory/banking/BankAccountFactory.java new file mode 100644 index 0000000..962ddf2 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/factory/banking/BankAccountFactory.java @@ -0,0 +1,20 @@ +package javadevjournal.designpatterns.creational.factory.banking; + +/** + * @author Kunwar + */ +public class BankAccountFactory { + public BankAccount createAccount(String type){ + BankAccount bankAccount = null; + if (type.equals("P")){ + bankAccount = new PersonalAccount(); + } else if (type.equals("B")){ + bankAccount = new BusinessAccount(); + } else if (type.equals("C")){ + bankAccount = new CheckingAccount(); + } else { + System.out.println("Invalid type"); + } + return bankAccount; + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/factory/banking/Branch.java b/com/javadevjournal/designpatterns/creational/factory/banking/Branch.java new file mode 100644 index 0000000..625f8d3 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/factory/banking/Branch.java @@ -0,0 +1,22 @@ +package javadevjournal.designpatterns.creational.factory.banking; + +import java.util.Scanner; + +/** + * @author Kunwar + */ +public class Branch { + public static void main(String[] args) { + BankAccount bankAccount = null; + BankAccountFactory bankAccountFactory = new BankAccountFactory(); + Scanner in = new Scanner(System.in); + System.out.println("Please enter\n" + + " P for Personal account\n" + + " B for Business account\n" + + " C for Checking account\n" + + "----------------------------"); + String accountType = in.nextLine(); + bankAccount = bankAccountFactory.createAccount(accountType); + bankAccount.registerAccount();; + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/factory/banking/BusinessAccount.java b/com/javadevjournal/designpatterns/creational/factory/banking/BusinessAccount.java new file mode 100644 index 0000000..a1dd8cf --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/factory/banking/BusinessAccount.java @@ -0,0 +1,11 @@ +package javadevjournal.designpatterns.creational.factory.banking; + +/** + * @author Kunwar + */ +public class BusinessAccount implements BankAccount { + @Override + public void registerAccount() { + System.out.println("Creating a business account"); + } +} diff --git a/com/javadevjournal/designpatterns/creational/factory/banking/CheckingAccount.java b/com/javadevjournal/designpatterns/creational/factory/banking/CheckingAccount.java new file mode 100644 index 0000000..670a42e --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/factory/banking/CheckingAccount.java @@ -0,0 +1,11 @@ +package javadevjournal.designpatterns.creational.factory.banking; + +/** + * @author Kunwar + */ +public class CheckingAccount implements BankAccount{ + @Override + public void registerAccount() { + System.out.println("Creating a checking account"); + } +} diff --git a/com/javadevjournal/designpatterns/creational/factory/banking/PersonalAccount.java b/com/javadevjournal/designpatterns/creational/factory/banking/PersonalAccount.java new file mode 100644 index 0000000..e3e3d1d --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/factory/banking/PersonalAccount.java @@ -0,0 +1,11 @@ +package javadevjournal.designpatterns.creational.factory.banking; + +/** + * @author Kunwar + */ +public class PersonalAccount implements BankAccount{ + @Override + public void registerAccount() { + System.out.println("Creating a personal account"); + } +} diff --git a/com/javadevjournal/designpatterns/creational/singleton/Singleton.java b/com/javadevjournal/designpatterns/creational/singleton/Singleton.java new file mode 100644 index 0000000..7ba81c5 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/singleton/Singleton.java @@ -0,0 +1,18 @@ +package javadevjournal.designpatterns.creational.singleton; + +/** + * @author Kunwar + */ +public class Singleton { + + /* private instance variable */ + private static Singleton instance = new Singleton(); + + /* private constructor */ + private Singleton(){} + + /* returns the same object */ + public static Singleton getInstance(){ + return instance; + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/singleton/SingletonMultiThreaded.java b/com/javadevjournal/designpatterns/creational/singleton/SingletonMultiThreaded.java new file mode 100644 index 0000000..4a721d6 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/singleton/SingletonMultiThreaded.java @@ -0,0 +1,23 @@ +package javadevjournal.designpatterns.creational.singleton; + +public class SingletonMultiThreaded { + + /* private instance variable */ + private static volatile SingletonMultiThreaded INSTANCE; + + /* private constructor */ + private SingletonMultiThreaded() { } + + public static SingletonMultiThreaded getInstance() { + /* double-checking lock */ + if(null == INSTANCE){ + /* synchronized block */ + synchronized (SingletonMultiThreaded.class) { + if(null == INSTANCE){ + INSTANCE = new SingletonMultiThreaded(); + } + } + } + return INSTANCE; + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/singleton/SingletonPatternDemo.java b/com/javadevjournal/designpatterns/creational/singleton/SingletonPatternDemo.java new file mode 100644 index 0000000..df0a123 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/singleton/SingletonPatternDemo.java @@ -0,0 +1,24 @@ +package javadevjournal.designpatterns.creational.singleton; + +/** + * @author Kunwar + */ +public class SingletonPatternDemo { + public static void main(String[] args) { + /* Let's create 3 objects and see their hashcode and they will be same. */ + System.out.println("in single threaded environment"); + Singleton singleton1 = Singleton.getInstance(); + Singleton singleton2 = Singleton.getInstance(); + Singleton singleton3 = Singleton.getInstance(); + System.out.println(singleton1.hashCode() +" "+ singleton2.hashCode() +" "+ singleton3.hashCode()); + + System.out.println("in multi threaded environment"); + Thread1 t1 = new Thread1(); + t1.run(); + Thread2 t2 = new Thread2(); + t2.run(); + Thread3 t3 = new Thread3(); + t3.run(); + + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/creational/singleton/Thread1.java b/com/javadevjournal/designpatterns/creational/singleton/Thread1.java new file mode 100644 index 0000000..8c68164 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/singleton/Thread1.java @@ -0,0 +1,9 @@ +package javadevjournal.designpatterns.creational.singleton; + +public class Thread1 implements Runnable{ + @Override + public void run() { + SingletonMultiThreaded singletonMultiThreaded = SingletonMultiThreaded.getInstance(); + System.out.print(singletonMultiThreaded.hashCode() + " "); + } +} diff --git a/com/javadevjournal/designpatterns/creational/singleton/Thread2.java b/com/javadevjournal/designpatterns/creational/singleton/Thread2.java new file mode 100644 index 0000000..e4a359d --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/singleton/Thread2.java @@ -0,0 +1,9 @@ +package javadevjournal.designpatterns.creational.singleton; + +public class Thread2 implements Runnable{ + @Override + public void run() { + SingletonMultiThreaded singletonMultiThreaded = SingletonMultiThreaded.getInstance(); + System.out.print(singletonMultiThreaded.hashCode() + " "); + } +} diff --git a/com/javadevjournal/designpatterns/creational/singleton/Thread3.java b/com/javadevjournal/designpatterns/creational/singleton/Thread3.java new file mode 100644 index 0000000..af58a48 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/singleton/Thread3.java @@ -0,0 +1,9 @@ +package javadevjournal.designpatterns.creational.singleton; + +public class Thread3 implements Runnable{ + @Override + public void run() { + SingletonMultiThreaded singletonMultiThreaded = SingletonMultiThreaded.getInstance(); + System.out.println(singletonMultiThreaded.hashCode()); + } +} diff --git a/com/javadevjournal/designpatterns/creational/singleton/breakit/BreakSingletonUsingReflection.java b/com/javadevjournal/designpatterns/creational/singleton/breakit/BreakSingletonUsingReflection.java new file mode 100644 index 0000000..15831cc --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/singleton/breakit/BreakSingletonUsingReflection.java @@ -0,0 +1,27 @@ +package javadevjournal.designpatterns.creational.singleton.breakit; + +import java.lang.reflect.Constructor; + +/** + * @author Kunwar + */ +public class BreakSingletonUsingReflection { + public static void main(String[] args) { + Singleton singleton1 = Singleton.instance; + Singleton singleton2 = null; + try { + Constructor[] constructors = + Singleton.class.getDeclaredConstructors(); + for (Constructor constructor : constructors) { + // Below code will destroy the singleton pattern + constructor.setAccessible(true); + singleton2 = (Singleton) constructor.newInstance(); + break; + } + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println("instance1.hashCode(): " + singleton1.hashCode()); + System.out.println("instance2.hashCode(): " + singleton2.hashCode()); + } +} diff --git a/com/javadevjournal/designpatterns/creational/singleton/breakit/Singleton.java b/com/javadevjournal/designpatterns/creational/singleton/breakit/Singleton.java new file mode 100644 index 0000000..4057054 --- /dev/null +++ b/com/javadevjournal/designpatterns/creational/singleton/breakit/Singleton.java @@ -0,0 +1,10 @@ +package javadevjournal.designpatterns.creational.singleton.breakit; + +/** + * @author Kunwar + */ +class Singleton{ + public static Singleton instance = new Singleton(); + private Singleton() { + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/structural/adapter/AdapterPatternDemo.java b/com/javadevjournal/designpatterns/structural/adapter/AdapterPatternDemo.java new file mode 100644 index 0000000..f4154d3 --- /dev/null +++ b/com/javadevjournal/designpatterns/structural/adapter/AdapterPatternDemo.java @@ -0,0 +1,14 @@ +package javadevjournal.designpatterns.structural.adapter; + +/** + * @author Kunwar + */ +public class AdapterPatternDemo { + public static void main(String[] args) { + AudioPlayer audioPlayer = new AudioPlayer(); + audioPlayer.playMusic("mp3", "song1.mp3"); + audioPlayer.playMusic("mp4", "song2.mp4"); + audioPlayer.playMusic("vlc", "song3.vlc"); + audioPlayer.playMusic("xyz", "song4.avi"); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/structural/adapter/AdvancedMediaPlayer.java b/com/javadevjournal/designpatterns/structural/adapter/AdvancedMediaPlayer.java new file mode 100644 index 0000000..cac1f93 --- /dev/null +++ b/com/javadevjournal/designpatterns/structural/adapter/AdvancedMediaPlayer.java @@ -0,0 +1,9 @@ +package javadevjournal.designpatterns.structural.adapter; + +/** + * @author Kunwar + */ +public interface AdvancedMediaPlayer { + void playVlcPlayer(String fileName); + void playMp4Player(String fileName); +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/structural/adapter/AudioPlayer.java b/com/javadevjournal/designpatterns/structural/adapter/AudioPlayer.java new file mode 100644 index 0000000..43019fb --- /dev/null +++ b/com/javadevjournal/designpatterns/structural/adapter/AudioPlayer.java @@ -0,0 +1,22 @@ +package javadevjournal.designpatterns.structural.adapter; + +/** + * @author Kunwar + */ +public class AudioPlayer implements MediaPlayer { + private MediaAdapter mediaAdapter; + @Override + public void playMusic(String audioType, String fileName) { + //the mp3 format is supported by AudioPlayer itself and it doesn't need adapter here. + if(audioType.equalsIgnoreCase("mp3")){ + System.out.println("Playing mp3 file: " + fileName); + } + //to support other formats, we will need the MediaAdapter + else if(audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")){ + mediaAdapter = new MediaAdapter(audioType); + mediaAdapter.playMusic(audioType, fileName); + }else{ + System.out.println("The given format: " + audioType + " is not supported"); + } + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/structural/adapter/MediaAdapter.java b/com/javadevjournal/designpatterns/structural/adapter/MediaAdapter.java new file mode 100644 index 0000000..fc5c51a --- /dev/null +++ b/com/javadevjournal/designpatterns/structural/adapter/MediaAdapter.java @@ -0,0 +1,28 @@ +package javadevjournal.designpatterns.structural.adapter; + +/** + * @author Kunwar + */ +public class MediaAdapter implements MediaPlayer { + + public static final String VLC = "vlc"; + public static final String MP_4 = "mp4"; + + private AdvancedMediaPlayer advancedMusicPlayer; + public MediaAdapter(String audioType){ + if(audioType.equalsIgnoreCase(VLC) ){ + advancedMusicPlayer = new VlcMusicPlayer(); + }else if (audioType.equalsIgnoreCase(MP_4)){ + advancedMusicPlayer = new Mp4MusicPlayer(); + } + } + + @Override + public void playMusic(String audioType, String fileName) { + if(audioType.equalsIgnoreCase(VLC)){ + advancedMusicPlayer.playVlcPlayer(fileName); + }else if(audioType.equalsIgnoreCase(MP_4)){ + advancedMusicPlayer.playMp4Player(fileName); + } + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/structural/adapter/MediaPlayer.java b/com/javadevjournal/designpatterns/structural/adapter/MediaPlayer.java new file mode 100644 index 0000000..d02db09 --- /dev/null +++ b/com/javadevjournal/designpatterns/structural/adapter/MediaPlayer.java @@ -0,0 +1,8 @@ +package javadevjournal.designpatterns.structural.adapter; + +/** + * @author Kunwar + */ +public interface MediaPlayer{ + void playMusic(String audioType, String fileName); +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/structural/adapter/Mp4MusicPlayer.java b/com/javadevjournal/designpatterns/structural/adapter/Mp4MusicPlayer.java new file mode 100644 index 0000000..5f62c82 --- /dev/null +++ b/com/javadevjournal/designpatterns/structural/adapter/Mp4MusicPlayer.java @@ -0,0 +1,17 @@ +package javadevjournal.designpatterns.structural.adapter; + +/** + * @author Kunwar + */ +public class Mp4MusicPlayer implements AdvancedMediaPlayer{ + + @Override + public void playVlcPlayer(String fileName) { + //do nothing + } + + @Override + public void playMp4Player(String fileName) { + System.out.println("Playing mp4 file: "+ fileName); + } +} \ No newline at end of file diff --git a/com/javadevjournal/designpatterns/structural/adapter/VlcMusicPlayer.java b/com/javadevjournal/designpatterns/structural/adapter/VlcMusicPlayer.java new file mode 100644 index 0000000..685980d --- /dev/null +++ b/com/javadevjournal/designpatterns/structural/adapter/VlcMusicPlayer.java @@ -0,0 +1,16 @@ +package javadevjournal.designpatterns.structural.adapter; + +/** + * @author Kunwar + */ +public class VlcMusicPlayer implements AdvancedMediaPlayer{ + @Override + public void playVlcPlayer(String fileName){ + System.out.println("Playing vlc file: "+ fileName); + } + + @Override + public void playMp4Player(String fileName) { + //do nothing + } +} \ No newline at end of file