GoF Design Patterns Using Java – Part 01
- April 28, 2021
- 2911 Unique Views
- 11 min read
[About SKP's Core Java/Java EE Roots]
Link to YouTube Video - Introduction to Design Patterns
Observer Pattern
package com.sumsoft.design.patterns.observer;
/*
* @author Sumith Puri
*/
public interface Observer {
public void update(String stockSymbol, Float stockValue, Integer stockUnits);
}
package com.sumsoft.design.patterns.observer;
/*
* @author Sumith Puri
*/
public class IncomeHandler implements Observer {
Subject stockData = null;
public IncomeHandler(Subject stockData) {
this.stockData = stockData;
stockData.addObserver(this);
}
@Override
public void update(String stockSymbol, Float stockValue, Integer stockUnits) {
System.out.println("IncomeHandler received changes... ");
}
}
package com.sumsoft.design.patterns.observer;
/*
* @author Sumith Puri
*/
public interface Subject {
public void addObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
package com.sumsoft.design.patterns.observer;
import java.util.ArrayList;
import java.util.List;
/*
* @author Sumith Puri
*/
public class StockData implements Subject {
private String stockSymbol = null;
private Float stockValue = null;
private Integer stockUnits = null;
private List<Observer> observers = null;
public StockData() {
observers = new ArrayList<Observer>();
}
@Override
public void addObserver(Observer o) {
observers.add(o);
}
@Override
public void notifyObservers() {
for(Observer o: observers) {
o.update(stockSymbol, stockValue, stockUnits);
}
}
@Override
public void removeObserver(Observer o) {
observers.remove(o);
}
public void setStockData(String stockSymbol, Float stockValue, Integer stockUnits) {
// In real-time, this method might be invoked with values from a live web service at regular intervals.
this.stockSymbol = stockSymbol;
this.stockValue = stockValue;
this.stockUnits = stockUnits;
setDataChanged();
}
private void setDataChanged() {
notifyObservers();
}
}
Decorator Pattern
package com.sumsoft.design.patterns.decorator;
/*
* @author Sumith Puri
*/
public abstract class ToppingDecorator extends Pizza {
public abstract String getDescription();
}
package com.sumsoft.design.patterns.decorator;
/*
* @author Sumith Puri
*/
public class Mushroom extends ToppingDecorator {
Pizza pizza;
public Mushroom(Pizza pizza) {
this.pizza = pizza;
}
@Override
public String getDescription() {
return pizza.getDescription() + ", Mushroom";
}
@Override
public double cost() {
return 0.25 + pizza.cost();
}
}
package com.sumsoft.design.patterns.decorator;
/*
* @author Sumith Puri
*/
public abstract class Pizza {
protected String description = null;
public String getDescription() {
return description;
}
public abstract double cost();
}
package com.sumsoft.design.patterns.decorator;
/*
* @author Sumith Puri
*/
public class Italian extends Pizza {
public Italian(String description) {
this.description = description + ", Italian";
}
@Override
public double cost() {
return 1.20;
}
}
package com.sumsoft.design.patterns.decorator;
/*
* @author Sumith Puri
*/
public class PizzaWorld {
public static void main(String args[]) {
Pizza pizza = new Hawaiian("Veg Exotica");
pizza = new Mushroom(pizza);
pizza = new Mushroom(pizza);
pizza = new Onion(pizza);
Pizza pizza1 = new Italian("Non-Veg Supreme");
pizza1 = new Chicken(pizza1);
pizza1 = new Chicken(pizza1);
pizza1 = new Onion(pizza1);
pizza1 = new Onion(pizza1);
System.out.println("Pizza World");
System.out.println("===========");
System.out.println("");
System.out.println(pizza.getDescription() + " " + pizza.cost());
System.out.println(pizza1.getDescription() + " " + pizza1.cost());
}
}
Singleton Pattern
Eager Singleton
package com.sumsoft.design.patterns.singleton.eager;
/*
* @author Sumith Puri
*/
public class ProductionHouse {
private static ProductionHouse productionHouse = new ProductionHouse();
private ProductionHouse() {
}
public static synchronized ProductionHouse getInstance() {
return productionHouse;
}
}
Thread-Safe Singleton (Most Common)
package com.sumsoft.design.patterns.singleton.threadsafe;
/*
* @author Sumith Puri
*/
public class ProductionHouse {
private static ProductionHouse productionHouse = null;
private ProductionHouse() {
}
public static synchronized ProductionHouse getInstance() {
if(productionHouse == null) {
productionHouse = new ProductionHouse();
}
return productionHouse;
}
}
Double-Checked Locking
package com.sumsoft.design.patterns.singleton.doublechecked;
/*
* @author Sumith Puri
*/
public class ProductionHouse {
private static ProductionHouse productionHouse = null;
private ProductionHouse() {
}
public static ProductionHouse getInstance() {
if(productionHouse == null) {
synchronized(ProductionHouse.class) {
if(productionHouse == null) {
productionHouse = new ProductionHouse();
}
}
}
return productionHouse;
}
}
package com.sumsoft.design.patterns.singleton.doublechecked;
/*
* @author Sumith Puri
*/
public class MediaContract extends Thread {
public void run() {
getProductionHouse();
}
public void getProductionHouse() {
ProductionHouse productionHouse = ProductionHouse.getInstance();
System.out.println(productionHouse.toString());
}
public static void main(String args[]) {
MediaContract thread01 = new MediaContract();
thread01.start();
MediaContract thread02 = new MediaContract();
thread02.start();
}
}
Command Pattern
package com.sumsoft.design.patterns.command;
/*
* @author Sumith Puri
*/
public abstract class AuctionItem {
public void sell() {
}
}
package com.sumsoft.design.patterns.command;
/*
* @author Sumith Puri
*/
public class AuctionFurniture extends AuctionItem {
public void sell() {
System.out.println("Sold Furniture Item");
}
}
package com.sumsoft.design.patterns.command;
import java.util.HashMap;
import java.util.Map;
/*
* @author Sumith Puri
*/
public class AuctionControl {
Map<String, AuctionItem> auctionItems = new HashMap<String, AuctionItem>();
public void setAuctionItem(String itemKey, AuctionItem auctionItem) {
auctionItems.put(itemKey, auctionItem);
}
public void presentItem(String itemKey) {
AuctionItem auctionItem = auctionItems.get(itemKey);
auctionItem.sell();
}
}
Factory Pattern
Simple Factory
package com.sumsoft.design.patterns.factory.simple;
/*
* @author Sumith Puri
*/
public interface System {
public void provision();
public void update();
public void restart();
}
package com.sumsoft.design.patterns.factory.simple;
/*
* @author Sumith Puri
*/
public class UnixSystem implements System {
@Override
public void provision() {
// TODO Auto-generated method stub
}
@Override
public void restart() {
// TODO Auto-generated method stub
}
@Override
public void update() {
// TODO Auto-generated method stub
}
}
package com.sumsoft.design.patterns.factory.simple;
/*
* @author Sumith Puri
*/
public class SystemFactory {
public System createSystem(String type) {
System system = null;
if(type.equals("WIN")) {
system = new WindowsSystem();
} else if (type.equals("LIN")) {
system = new LinuxSystem();
} else if (type.equals("SOL")) {
system = new SolarisSystem();
} else if (type.equals("MAC")) {
system = new MacosSystem();
} else {
system = new UnixSystem();
}
return system;
}
}
Factory Method
package com.sumsoft.design.patterns.factory.method;
/*
* @author Sumith Puri
*/
public abstract class Mobile {
public void chassis() {
System.out.println("Default Chassis Included.");
}
public void experience() {
System.out.println("Default Experience Hardware.");
}
public void integrity() {
System.out.println("Default Integrity Check.");
}
public void box() {
System.out.println("Default Box Packaging.");
}
public void software() {
System.out.println("Default Software Bundled.");
}
}
package com.sumsoft.design.patterns.factory.method;
/*
* @author Sumith Puri
*/
public class NokiaASeries extends Mobile {
public void experience() {
System.out.println("Nokia Premium Hardware.");
}
}
package com.sumsoft.design.patterns.factory.method;
/*
* @author Sumith Puri
*/
public class SonyASeries extends Mobile {
public void experience() {
System.out.println("Sony Premium Hardware.");
}
}
package com.sumsoft.design.patterns.factory.method;
/*
* @author Sumith Puri
*/
public abstract class MobileStore {
public Mobile assemble(String make) {
Mobile mobile;
mobile = createMobile(make);
mobile.chassis();
mobile.integrity();
mobile.experience();
mobile.software();
mobile.box();
return mobile;
}
protected abstract Mobile createMobile(String make);
}
package com.sumsoft.design.patterns.factory.method;
/*
* @author Sumith Puri
*/
public class NokiaStore extends MobileStore {
@Override
protected Mobile createMobile(String make) {
Mobile mobile = null;
if(make.equals("ASeries")) {
mobile = new NokiaASeries();
} else if(make.equals("BSeries")) {
mobile = new NokiaBSeries();
} else if(make.equals("CSeries")) {
mobile = new NokiaCSeries();
}
return mobile;
}
}
package com.sumsoft.design.patterns.factory.method;
/*
* @author Sumith Puri
*/
public class MobileStoreCentre {
public static void main(String args[]) {
MobileStore mobileStore01 = new NokiaStore();
MobileStore mobileStore02 = new SonyStore();
Mobile mobile01 = mobileStore01.assemble("ASeries");
Mobile mobile02 = mobileStore02.assemble("BSeries");
}
}
Abstract Factory
package com.sumsoft.design.patterns.factory.abstract_;
/**
* @author sumith_puri
*
* The Abstract Factory Design Pattern will instantiate the appropriate abstract
* factory.
*/
public class MobileStoreFactory {
// Get Abstract Factory
public static MobileStore getMobileStore(String mobileStore) {
MobileStore mStore = null;
if ("Nokia".equalsIgnoreCase(mobileStore))
mStore = new NokiaStore();
else if ("Sony".equalsIgnoreCase(mobileStore))
mStore = new SonyStore();
return mStore;
}
}
package com.sumsoft.design.patterns.factory.abstract_;
/*
* @author Sumith Puri
*/
public class MobileStoreCentre {
public static void main(String args[]) {
MobileStore mobileStore = MobileStoreFactory.getMobileStore("Nokia");
Mobile mobile = mobileStore.assemble("ASeries");
mobile.experience();
System.out.println("");
mobileStore = MobileStoreFactory.getMobileStore("Sony");
mobile = mobileStore.assemble("BSeries");
mobile.experience();
}
}
Don’t Forget to Share This Post!
Comments (0)
No comments yet. Be the first.