Java Design patterns
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
package javadevjournal.design.creational.abstractfactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public abstract class AbstractFactory {
|
||||||
|
abstract Shape getShape(String shapeType) ;
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package javadevjournal.design.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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package javadevjournal.design.creational.abstractfactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public class FactoryOfFactory {
|
||||||
|
public static AbstractFactory getFactory(boolean rounded){
|
||||||
|
if(rounded){
|
||||||
|
return new RoundedShapeFactory();
|
||||||
|
}else{
|
||||||
|
return new ShapeFactory();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package javadevjournal.design.creational.abstractfactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public class Rectangle implements Shape {
|
||||||
|
@Override
|
||||||
|
public void drawShape() {
|
||||||
|
System.out.println("Inside Rectangle::draw() method.");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package javadevjournal.design.creational.abstractfactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public class RoundedRectangle implements Shape {
|
||||||
|
@Override
|
||||||
|
public void drawShape() {
|
||||||
|
System.out.println("Inside RoundedRectangle::draw() method.");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package javadevjournal.design.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package javadevjournal.design.creational.abstractfactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public class RoundedSquare implements Shape {
|
||||||
|
@Override
|
||||||
|
public void drawShape() {
|
||||||
|
System.out.println("Inside RoundedSquare::draw() method.");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package javadevjournal.design.creational.abstractfactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public interface Shape {
|
||||||
|
void drawShape();
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package javadevjournal.design.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package javadevjournal.design.creational.abstractfactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public class Square implements Shape {
|
||||||
|
@Override
|
||||||
|
public void drawShape() {
|
||||||
|
System.out.println("Inside Square::draw() method.");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package javadevjournal.design.creational.abstractfactory.example2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract Factory - Factory of Factories
|
||||||
|
*/
|
||||||
|
public abstract class AbstractFactory{
|
||||||
|
abstract IMobile getMobile(String mobileModel) ;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package javadevjournal.design.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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package javadevjournal.design.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package javadevjournal.design.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package javadevjournal.design.creational.abstractfactory.example2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mobile
|
||||||
|
*/
|
||||||
|
public interface IMobile {
|
||||||
|
void brandName();
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package javadevjournal.design.creational.abstractfactory.example2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iphone Mobile
|
||||||
|
*/
|
||||||
|
public class Iphone implements IMobile {
|
||||||
|
@Override
|
||||||
|
public void brandName() {
|
||||||
|
System.out.println("The brand name is Iphone");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package javadevjournal.design.creational.abstractfactory.example2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Nokia Mobile Concrete Class
|
||||||
|
*/
|
||||||
|
public class Lava implements IMobile {
|
||||||
|
@Override
|
||||||
|
public void brandName() {
|
||||||
|
System.out.println("The brand name is Lava");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package javadevjournal.design.creational.abstractfactory.example2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Factory Producer
|
||||||
|
*/
|
||||||
|
public class MpbileFactoryProducer {
|
||||||
|
public static AbstractFactory getFactory(boolean isApple){
|
||||||
|
if(isApple){
|
||||||
|
return new AppleMobileFactory();
|
||||||
|
}else{
|
||||||
|
return new AndroidMobileFactory();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package javadevjournal.design.creational.abstractfactory.example2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OnePlus Mobile
|
||||||
|
*/
|
||||||
|
public class OnePlus implements IMobile {
|
||||||
|
@Override
|
||||||
|
public void brandName() {
|
||||||
|
System.out.println("The brand name is OnePlus");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package javadevjournal.design.creational.abstractfactory.example2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sony Mobile
|
||||||
|
*/
|
||||||
|
public class Sony implements IMobile {
|
||||||
|
@Override
|
||||||
|
public void brandName() {
|
||||||
|
System.out.println("The brand name is Sony");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package javadevjournal.design.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());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
package javadevjournal.design.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 +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package javadevjournal.design.creational.factory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public class Circle implements Shape {
|
||||||
|
@Override
|
||||||
|
public void drawShape() {
|
||||||
|
System.out.println("Inside Circle::drawShape() method.");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package javadevjournal.design.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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package javadevjournal.design.creational.factory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public class Rectangle implements Shape {
|
||||||
|
@Override
|
||||||
|
public void drawShape() {
|
||||||
|
System.out.println("Inside Rectangle::drawShape() method.");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package javadevjournal.design.creational.factory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public interface Shape {
|
||||||
|
void drawShape();
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package javadevjournal.design.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package javadevjournal.design.creational.factory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public class Square implements Shape {
|
||||||
|
@Override
|
||||||
|
public void drawShape() {
|
||||||
|
System.out.println("Inside Square::drawShape() method.");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package javadevjournal.design.creational.factory.banking;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public interface BankAccount {
|
||||||
|
public void registerAccount();
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package javadevjournal.design.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package javadevjournal.design.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();;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package javadevjournal.design.creational.factory.banking;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public class BusinessAccount implements BankAccount {
|
||||||
|
@Override
|
||||||
|
public void registerAccount() {
|
||||||
|
System.out.println("Creating a business account");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package javadevjournal.design.creational.factory.banking;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public class CheckingAccount implements BankAccount{
|
||||||
|
@Override
|
||||||
|
public void registerAccount() {
|
||||||
|
System.out.println("Creating a checking account");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package javadevjournal.design.creational.factory.banking;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public class PersonalAccount implements BankAccount{
|
||||||
|
@Override
|
||||||
|
public void registerAccount() {
|
||||||
|
System.out.println("Creating a personal account");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package javadevjournal.design.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package javadevjournal.design.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package javadevjournal.design.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();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package javadevjournal.design.creational.singleton;
|
||||||
|
|
||||||
|
public class Thread1 implements Runnable{
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
SingletonMultiThreaded singletonMultiThreaded = SingletonMultiThreaded.getInstance();
|
||||||
|
System.out.print(singletonMultiThreaded.hashCode() + " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package javadevjournal.design.creational.singleton;
|
||||||
|
|
||||||
|
public class Thread2 implements Runnable{
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
SingletonMultiThreaded singletonMultiThreaded = SingletonMultiThreaded.getInstance();
|
||||||
|
System.out.print(singletonMultiThreaded.hashCode() + " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package javadevjournal.design.creational.singleton;
|
||||||
|
|
||||||
|
public class Thread3 implements Runnable{
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
SingletonMultiThreaded singletonMultiThreaded = SingletonMultiThreaded.getInstance();
|
||||||
|
System.out.println(singletonMultiThreaded.hashCode());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package javadevjournal.design.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());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package javadevjournal.design.creational.singleton.breakit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
class Singleton{
|
||||||
|
public static Singleton instance = new Singleton();
|
||||||
|
private Singleton() {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package javadevjournal.design.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");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package javadevjournal.design.structural.adapter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public interface AdvancedMediaPlayer {
|
||||||
|
void playVlcPlayer(String fileName);
|
||||||
|
void playMp4Player(String fileName);
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package javadevjournal.design.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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package javadevjournal.design.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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package javadevjournal.design.structural.adapter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kunwar
|
||||||
|
*/
|
||||||
|
public interface MediaPlayer{
|
||||||
|
void playMusic(String audioType, String fileName);
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package javadevjournal.design.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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package javadevjournal.design.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
|
||||||
|
}
|
||||||
|
}
|
||||||
22
Java Design Patterns/javadevjournal/ds/avl/AVLNode.java
Normal file
22
Java Design Patterns/javadevjournal/ds/avl/AVLNode.java
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package javadevjournal.ds.avl;
|
||||||
|
|
||||||
|
class AVLNode{
|
||||||
|
|
||||||
|
AVLNode left, right;
|
||||||
|
int data;
|
||||||
|
int height;
|
||||||
|
|
||||||
|
public AVLNode(){
|
||||||
|
left = null;
|
||||||
|
right = null;
|
||||||
|
data = 0;
|
||||||
|
height = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AVLNode(int n){
|
||||||
|
left = null;
|
||||||
|
right = null;
|
||||||
|
data = n;
|
||||||
|
height = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
195
Java Design Patterns/javadevjournal/ds/avl/AVLTree.java
Normal file
195
Java Design Patterns/javadevjournal/ds/avl/AVLTree.java
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
package javadevjournal.ds.avl;
|
||||||
|
|
||||||
|
class AVLTree{
|
||||||
|
private AVLNode root;
|
||||||
|
public AVLTree(){
|
||||||
|
root = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param avlNode
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private int height(AVLNode avlNode ){
|
||||||
|
return avlNode == null ? -1 : avlNode.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param lHeight
|
||||||
|
* @param rHeight
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private int max(int lHeight, int rHeight){
|
||||||
|
return lHeight > rHeight ? lHeight : rHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
public void insert(int data){
|
||||||
|
root = insert(data, root);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param data
|
||||||
|
* @param avlNode
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private AVLNode insert(int data, AVLNode avlNode)
|
||||||
|
{
|
||||||
|
if (avlNode == null)
|
||||||
|
avlNode = new AVLNode(data);
|
||||||
|
else if (data < avlNode.data){
|
||||||
|
avlNode.left = insert( data, avlNode.left );
|
||||||
|
if( height( avlNode.left ) - height( avlNode.right ) == 2 )
|
||||||
|
if( data < avlNode.left.data )
|
||||||
|
avlNode = leftRotation( avlNode );
|
||||||
|
else
|
||||||
|
avlNode = leftRightRotation( avlNode );
|
||||||
|
}
|
||||||
|
else if( data > avlNode.data ){
|
||||||
|
avlNode.right = insert( data, avlNode.right );
|
||||||
|
if( height( avlNode.right ) - height( avlNode.left ) == 2 )
|
||||||
|
if( data > avlNode.right.data)
|
||||||
|
avlNode = rightRotation( avlNode );
|
||||||
|
else
|
||||||
|
avlNode = rightLeftRotation( avlNode );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
; // Duplicate; do nothing
|
||||||
|
avlNode.height = max( height( avlNode.left ), height( avlNode.right ) ) + 1;
|
||||||
|
return avlNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param avlNode
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private AVLNode leftRotation(AVLNode avlNode){
|
||||||
|
AVLNode k1 = avlNode.left;
|
||||||
|
avlNode.left = k1.right;
|
||||||
|
k1.right = avlNode;
|
||||||
|
avlNode.height = max( height( avlNode.left ), height( avlNode.right ) ) + 1;
|
||||||
|
k1.height = max( height( k1.left ), avlNode.height ) + 1;
|
||||||
|
return k1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param avlNode
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private AVLNode rightRotation(AVLNode avlNode){
|
||||||
|
AVLNode node = avlNode.right;
|
||||||
|
avlNode.right = node.left;
|
||||||
|
node.left = avlNode;
|
||||||
|
avlNode.height = max( height( avlNode.left ), height( avlNode.right ) ) + 1;
|
||||||
|
node.height = max( height( node.right ), avlNode.height ) + 1;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* left-right rotation
|
||||||
|
* @param avlNode
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private AVLNode leftRightRotation(AVLNode avlNode){
|
||||||
|
avlNode.left = rightRotation( avlNode.left );
|
||||||
|
return leftRotation( avlNode );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* right-left rotation
|
||||||
|
* @param avlNode
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private AVLNode rightLeftRotation(AVLNode avlNode)
|
||||||
|
{
|
||||||
|
avlNode.right = leftRotation( avlNode.right );
|
||||||
|
return rightRotation( avlNode );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int countNodes(){
|
||||||
|
return countNodes(root);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param avlNode
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private int countNodes(AVLNode avlNode){
|
||||||
|
if (avlNode == null)
|
||||||
|
return 0;
|
||||||
|
else{
|
||||||
|
int l = 1;
|
||||||
|
l += countNodes(avlNode.left);
|
||||||
|
l += countNodes(avlNode.right);
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param data
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean search(int data){
|
||||||
|
return search(root, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param avlNode
|
||||||
|
* @param data
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private boolean search(AVLNode avlNode, int data){
|
||||||
|
boolean found = false;
|
||||||
|
while ((avlNode != null) && !found)
|
||||||
|
{
|
||||||
|
int rval = avlNode.data;
|
||||||
|
if (data < rval)
|
||||||
|
avlNode = avlNode.left;
|
||||||
|
else if (data > rval)
|
||||||
|
avlNode = avlNode.right;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
found = search(avlNode, data);
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void inorder(){
|
||||||
|
inorder(root);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param avlNode
|
||||||
|
*/
|
||||||
|
private void inorder(AVLNode avlNode){
|
||||||
|
if (avlNode != null){
|
||||||
|
inorder(avlNode.left);
|
||||||
|
System.out.print(avlNode.data +" ");
|
||||||
|
inorder(avlNode.right);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package javadevjournal.ds.avl;
|
||||||
|
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
public class AVLTreeHelper{
|
||||||
|
public static void main(String[] args){
|
||||||
|
Scanner scanner = new Scanner(System.in);
|
||||||
|
AVLTree avlTree = new AVLTree();
|
||||||
|
|
||||||
|
char ch;
|
||||||
|
do{
|
||||||
|
System.out.println("\nAVLTree Operations\n");
|
||||||
|
System.out.println("1. insert ");
|
||||||
|
System.out.println("2. search");
|
||||||
|
System.out.println("3. count nodes");
|
||||||
|
int choice = scanner.nextInt();
|
||||||
|
switch (choice)
|
||||||
|
{
|
||||||
|
case 1 :
|
||||||
|
System.out.println("Enter integer element to insert");
|
||||||
|
avlTree.insert( scanner.nextInt() );
|
||||||
|
break;
|
||||||
|
case 2 :
|
||||||
|
System.out.println("Enter integer element to search");
|
||||||
|
System.out.println("Search result : "+ avlTree.search( scanner.nextInt()));
|
||||||
|
break;
|
||||||
|
case 3 :
|
||||||
|
System.out.println("Nodes = "+ avlTree.countNodes());
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
System.out.println("Wrong Entry \n ");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.print("\nIn order : ");
|
||||||
|
avlTree.inorder();
|
||||||
|
|
||||||
|
System.out.println("\nDo you want to continue (Type y or n) \n");
|
||||||
|
ch = scanner.next().charAt(0);
|
||||||
|
} while (ch == 'Y'|| ch == 'y');
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user