Skip to content

Document the Design Patterns with improvements #9

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,4 @@
*.log

# Compiled Files #
bin/
out/
6 changes: 0 additions & 6 deletions .idea/checkstyleidea-libs/readme.txt

This file was deleted.

2 changes: 1 addition & 1 deletion .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
# design-patterns
* ### Information Credits: [`refactoring.guru`](https://refactoring.guru/design-patterns)
* ### Documentation Credits: [`java-design-patterns`](https://java-design-patterns.com/patterns/)
* ### Video Credits: [`@ConceptAndCoding`](https://www.youtube.com/@ConceptandCoding)
2 changes: 1 addition & 1 deletion design-patterns.iml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<SOURCES>
<root url="jar://$USER_HOME$/.ideaLibSources/lombok-1.18.34-sources.jar!/" />
</SOURCES>
</library>ō
</library>
</orderEntry>
</component>
</module>
3 changes: 3 additions & 0 deletions src/course/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Learning Design Patterns with Java

### Coursera Course: https://www.coursera.org/learn/design-patterns
41 changes: 41 additions & 0 deletions src/practice/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Implementations of Design Patterns

* ### Examples of [Creational](./creational) Design Patterns with Java:

| Design Pattern | Information | Documentation | Video |
|:-----------------------------------------:|:-------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------:|
| [Factory Method](./creational/factory) | [`refactoring.guru`](https://refactoring.guru/design-patterns/factory-method) | [`java-design-patterns`](https://java-design-patterns.com/patterns/factory-method/) | |
| [Abstract Factory](./creational/notional) | [`refactoring.guru`](https://refactoring.guru/design-patterns/abstract-factory) | [`java-design-patterns`](https://java-design-patterns.com/patterns/abstract-factory/) | |
| [Builder](./creational/builder) | [`refactoring.guru`](https://refactoring.guru/design-patterns/builder) | [`java-design-patterns`](https://java-design-patterns.com/patterns/builder/) | [`@ConceptAndCoding`](https://youtu.be/qOLRxN5eVC0?si=E67H3Rx33vvzY4d_) |
| [Object Pool](./creational/pool) | N/A | [`java-design-patterns`](https://java-design-patterns.com/patterns/object-pool/) | [`@ConceptAndCoding`](https://youtu.be/obmc24IHqew?si=q7M84QnN_sbFrku0) |
| [Prototype](./creational/prototype) | [`refactoring.guru`](https://refactoring.guru/design-patterns/prototype) | [`java-design-patterns`](https://java-design-patterns.com/patterns/prototype/) | |
| [Singleton](./creational/singleton) | [`refactoring.guru`](https://refactoring.guru/design-patterns/singleton) | [`java-design-patterns`](https://java-design-patterns.com/patterns/singleton/) | |

* ### Examples of [Structural](./structural) Design Patterns with Java:

| Design Pattern | Information | Documentation | Video |
|:-----------------------------------:|:------------------------------------------------------------------------:|:------------------------------------------------------------------------------:|:-----------------------------------------------------------------------:|
| [Adapter](./structural/adapter) | [`refactoring.guru`](https://refactoring.guru/design-patterns/adapter) | [`java-design-patterns`](https://java-design-patterns.com/patterns/adapter/) | [`@ConceptAndCoding`](https://youtu.be/8wrg7IsILhQ?si=PF2kgCqwYN35dgao) |
| [Bridge](./structural/bridge) | [`refactoring.guru`](https://refactoring.guru/design-patterns/bridge) | [`java-design-patterns`](https://java-design-patterns.com/patterns/bridge/) | [`@ConceptAndCoding`](https://youtu.be/SOw1_W0taBg?si=4TxZSukUZCUYiNWj) |
| [Composite](./structural/composite) | [`refactoring.guru`](https://refactoring.guru/design-patterns/composite) | [`java-design-patterns`](https://java-design-patterns.com/patterns/composite/) | |
| [Decorator](./structural/decorator) | [`refactoring.guru`](https://refactoring.guru/design-patterns/decorator) | [`java-design-patterns`](https://java-design-patterns.com/patterns/decorator/) | [`@ConceptAndCoding`](https://youtu.be/w6a9MXUwcfY?si=KW_bfuG6F35_blZZ) |
| [Facade](./structural/facade) | [`refactoring.guru`](https://refactoring.guru/design-patterns/facade) | [`java-design-patterns`](https://java-design-patterns.com/patterns/facade/) | [`@ConceptAndCoding`](https://youtu.be/GYaBXK54eLo?si=aCmexb4t3izwlU9d) |
| [Flyweight](./structural/flyweight) | [`refactoring.guru`](https://refactoring.guru/design-patterns/flyweight) | [`java-design-patterns`](https://java-design-patterns.com/patterns/flyweight/) | |
| [Proxy](./structural/proxy) | [`refactoring.guru`](https://refactoring.guru/design-patterns/proxy) | [`java-design-patterns`](https://java-design-patterns.com/patterns/proxy/) | [`@ConceptAndCoding`](https://youtu.be/9MxHKlVc6ZM?si=tJME00X4UJ4XJJtc) |

* ### Examples of [Behavioral](./behavioral) Design Patterns with Java:

| Design Pattern | Information | Documentation | Video |
|:---------------------------------------------:|:--------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------:|
| [Chain of Responsibility](./behavioral/chain) | [`refactoring.guru`](https://refactoring.guru/design-patterns/chain-of-responsibility) | [`java-design-patterns`](https://java-design-patterns.com/patterns/chain-of-responsibility/) | [`@ConceptAndCoding`](https://youtu.be/gvIn5QBdGDk?si=30kOIX2x7Gx3MlqR) |
| [Command](./behavioral/command) | [`refactoring.guru`](https://refactoring.guru/design-patterns/command) | [`java-design-patterns`](https://java-design-patterns.com/patterns/command/) | [`@ConceptAndCoding`](https://youtu.be/E1lce5CWhE0?si=X4HIR777Y9ddFjPS) |
| Interpreter | N/A | [`java-design-patterns`](https://java-design-patterns.com/patterns/interpreter/) | [`@ConceptAndCoding`](https://youtu.be/fFlPm0pzQYI?si=4DuKSD2Qbt1NQFUE) |
| [Iterator](./behavioral/iterator) | [`refactoring.guru`](https://refactoring.guru/design-patterns/iterator) | [`java-design-patterns`](https://java-design-patterns.com/patterns/iterator/) | [`@ConceptAndCoding`](https://youtu.be/X7shKHOaYtU?si=F7dk7AZjEOaHpLhv) |
| [Mediator](./behavioral/mediator) | [`refactoring.guru`](https://refactoring.guru/design-patterns/mediator) | [`java-design-patterns`](https://java-design-patterns.com/patterns/mediator/) | |
| [Memento](./behavioral/memento) | [`refactoring.guru`](https://refactoring.guru/design-patterns/memento) | [`java-design-patterns`](https://java-design-patterns.com/patterns/memento/) | [`@ConceptAndCoding`](https://youtu.be/nTo7e2lpGZ4?si=9wsYjiNs3iG-g0ti) |
| Null Object | N/A | [`java-design-patterns`](https://java-design-patterns.com/patterns/null-object/) | [`@ConceptAndCoding`](https://youtu.be/iDPhxhamuTo?si=oBsfb-mqRKq764c8) |
| [Observer](./behavioral/observer) | [`refactoring.guru`](https://refactoring.guru/design-patterns/observer) | [`java-design-patterns`](https://java-design-patterns.com/patterns/observer/) | [`@ConceptAndCoding`](https://youtu.be/Ep9_Zcgst3U?si=Vq--dx8gSRqY7mrH) |
| [State](./behavioral/state) | [`refactoring.guru`](https://refactoring.guru/design-patterns/state) | [`java-design-patterns`](https://java-design-patterns.com/patterns/state/) | |
| [Strategy](./behavioral/strategy) | [`refactoring.guru`](https://refactoring.guru/design-patterns/strategy) | [`java-design-patterns`](https://java-design-patterns.com/patterns/strategy/) | [`@ConceptAndCoding`](https://youtu.be/u8DttUrXtEw?si=LskxabetaZKy9gKA) |
| [Template Method](./behavioral/template) | [`refactoring.guru`](https://refactoring.guru/design-patterns/template-method) | [`java-design-patterns`](https://java-design-patterns.com/patterns/template-method/) | [`@ConceptAndCoding`](https://youtu.be/kwy-G1DEm0M?si=yNZlZCuseVQaUCmT) |
| [Visitor](./behavioral/visitor) | [`refactoring.guru`](https://refactoring.guru/design-patterns/visitor) | [`java-design-patterns`](https://java-design-patterns.com/patterns/visitor/) | [`@ConceptAndCoding`](https://youtu.be/pDsz-AuFO0g?si=11YASEg0NspKyykR) |
5 changes: 5 additions & 0 deletions src/practice/behavioral/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Examples of `Behavioral` Design Patterns with Java

### Pluralsight Course: https://www.pluralsight.com/courses/design-patterns-java-behavioral

### YouTube Recap Video: https://youtu.be/DBDnUkTobaE?si=-bXWvLOWm9G9moRa
2 changes: 2 additions & 0 deletions src/practice/behavioral/chain/Worker.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package practice.behavioral.chain;

import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.Setter;
import lombok.extern.java.Log;

@Log
@Setter
@EqualsAndHashCode
public abstract sealed class Worker permits General, Jailer, King, Officer {

protected Worker next; // Worker who is NEXT in CHAIN of Responsibility
Expand Down
2 changes: 1 addition & 1 deletion src/practice/behavioral/command/SwitchButton.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public void toggleState() {
}

public void printState() {
var isOn = state ? "ON" : "OFF"; // Determine current state of Switch
var isOn = state ? "ON" : "OFF"; // Determine CURRENT state of Switch
log.info("State of <" + location + "> Switch => [" + isOn + "]");
}
}
2 changes: 1 addition & 1 deletion src/practice/behavioral/observer/Subject.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ public sealed interface Subject permits Weather {

void detach(@NonNull final Observer watcher);

void notifyObservers();
void notifyObservers(); // UPDATE Observers
}
8 changes: 4 additions & 4 deletions src/practice/behavioral/observer/Weather.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ public final class Weather implements Subject {

@Override
public void attach(@NonNull final Observer watcher) {
log.info("Attaching Observer => [" + watcher + "]");
log.info("ATTACHING Observer => [" + watcher + "]");
observers.add(watcher); // Add OBSERVER to current LIST
}

@Override
public void detach(@NonNull final Observer watcher) {
log.info("Detaching Observer => [" + watcher + "]");
log.info("DETACHING Observer => [" + watcher + "]");
observers.remove(watcher); // Remove OBSERVER from LIST
}

Expand All @@ -34,9 +34,9 @@ public void notifyObservers() {
}

public void advanceTime() {
log.info("Current Weather Type => [" + currentWeatherType + "]");
log.info("CURRENT Weather TYPE => [" + currentWeatherType + "]");
currentWeatherType = getFreshWeatherType(WeatherType.values());
log.info("Changed Weather Type => [" + currentWeatherType + "]");
log.info("CHANGED Weather TYPE => [" + currentWeatherType + "]");
notifyObservers(); // Update ALL Watchers of CHANGE in Weather
}

Expand Down
4 changes: 2 additions & 2 deletions src/practice/behavioral/state/HasCoinState.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ public void insertCoin(@NonNull final VendorMachine machine) {

@Override
public void ejectCoin(@NonNull final VendorMachine machine) {
machine.setState(new NoCoinState()); // ALTER State afterwards
machine.setState(new NoCoinState()); // ALTER state afterwards
log.info("PASSED in EJECTING Coin => [" + machine + "]");
}

@Override
public void dispenseFood(@NonNull final VendorMachine machine) {
machine.setState(new NoCoinState()); // ALTER State AFTER Action
machine.setState(new NoCoinState()); // ALTER state after action
log.info("PASSED in DISPENSING Food => [" + machine + "]");
}
}
2 changes: 1 addition & 1 deletion src/practice/behavioral/state/NoCoinState.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public final class NoCoinState implements VendorState {

@Override
public void insertCoin(@NonNull final VendorMachine machine) {
machine.setState(new HasCoinState()); // ALTER State afterwards
machine.setState(new HasCoinState()); // ALTER state afterwards
log.info("PASSED in INSERTING Coin => [" + machine + "]");
}

Expand Down
4 changes: 2 additions & 2 deletions src/practice/behavioral/state/VendorMachine.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ public final class VendorMachine {

public void insertMoney() {
log.info("ATTEMPT to INSERT Money => [" + this + "]");
state.insertCoin(this); // Try to INSERT Money
state.insertCoin(this); // Attempt to INSERT Money
}

public void ejectMoney() {
log.info("ATTEMPT to EJECT Money => [" + this + "]");
state.ejectCoin(this); // Try to EJECT Money
state.ejectCoin(this); // Attempt to EJECT Money
}

public void dispenseFood() {
Expand Down
4 changes: 2 additions & 2 deletions src/practice/behavioral/strategy/PaymentGateway.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public final class PaymentGateway {
private PaymentStrategy strategy;

public void checkout(@NonNull final int amount) {
log.info("SELECTED Strategy => " + strategy);
strategy.pay(amount); // EXECUTE specific Strategy
log.info("SELECTED Strategy => [" + strategy + "]");
strategy.pay(amount); // EXECUTE this SELECTED Strategy
}
}
2 changes: 1 addition & 1 deletion src/practice/behavioral/strategy/StrategyDemo.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public final class StrategyDemo {

public static void main(final String... arguments) {

final var gateway = new PaymentGateway();
final var gateway = new PaymentGateway(); // SAME Gateway

gateway.setStrategy(new CashPayment("wallet"));
gateway.checkout(1_000); // Make PAYMENT with CASH
Expand Down
2 changes: 1 addition & 1 deletion src/practice/behavioral/visitor/Captain.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
@ToString
public final class Captain extends ArmyUnit {

Captain(@NonNull final ArmyUnit... children) {
public Captain(@NonNull final ArmyUnit... children) {
super(children);
}

Expand Down
2 changes: 1 addition & 1 deletion src/practice/behavioral/visitor/Recruit.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
@ToString
public final class Recruit extends ArmyUnit {

Recruit(@NonNull final ArmyUnit... children) {
public Recruit(@NonNull final ArmyUnit... children) {
super(children);
}

Expand Down
2 changes: 1 addition & 1 deletion src/practice/behavioral/visitor/Sergeant.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
@ToString
public final class Sergeant extends ArmyUnit {

Sergeant(@NonNull final ArmyUnit... children) {
public Sergeant(@NonNull final ArmyUnit... children) {
super(children);
}

Expand Down
2 changes: 1 addition & 1 deletion src/practice/behavioral/visitor/VisitorDemo.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public static void main(final String[] arguments) {
final var soldier = new Captain(
new Sergeant(new Recruit(), new Recruit()),
new Sergeant(new Recruit(), new Recruit())
); // Create CAMP Hierarchy of Soldiers
); // Create Army CAMP hierarchy of Soldiers

soldier.accept(new RecruitFriend());
soldier.accept(new SergeantFriend());
Expand Down
5 changes: 5 additions & 0 deletions src/practice/creational/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Examples of `Creational` Design Patterns with Java

### Pluralsight Course: https://www.pluralsight.com/courses/java-se-17-creational-design-patterns

### YouTube Recap Video: https://youtu.be/OuNOyFg942M?si=AykaiZsmEG7qHfhx
11 changes: 4 additions & 7 deletions src/practice/creational/builder/BuilderDemo.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package practice.creational.builder;

import practice.creational.builder.CustomPizza.PizzaChef;
import practice.creational.builder.PizzaElement.DoughType;
import practice.creational.builder.PizzaElement.SauceType;
import practice.creational.builder.PizzaElement.ToppingType;

/**
* Example of Builder Design Pattern
Expand All @@ -12,10 +9,10 @@ public final class BuilderDemo {

public static void main(final String... arguments) {

new PizzaChef(DoughType.BAKED).setSauceType(SauceType.HOT)
.setTopping(ToppingType.CAPSICUM_MUSHROOM).cookPizza().eatPizza();
new PizzaChef(PizzaElement.DoughType.BAKED).setSauceType(PizzaElement.SauceType.HOT)
.setTopping(PizzaElement.ToppingType.CAPSICUM_MUSHROOM).cookPizza().eatPizza();

new PizzaChef(DoughType.CROSS).setSauceType(SauceType.MILD)
.setTopping(ToppingType.CHEESE_CORN_TOMATO).cookPizza().eatPizza();
new PizzaChef(PizzaElement.DoughType.CROSS).setSauceType(PizzaElement.SauceType.MILD)
.setTopping(PizzaElement.ToppingType.CHEESE_CORN_TOMATO).cookPizza().eatPizza();
}
}
4 changes: 2 additions & 2 deletions src/practice/creational/builder/CustomPizza.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public final class CustomPizza {
private final PizzaElement.ToppingType topping;

public void eatPizza() {
log.info("EATING Pizza => " + this);
log.info("EATING the Pizza => [" + this + "]");
}

@Setter
Expand All @@ -40,7 +40,7 @@ protected static final class PizzaChef {
private PizzaElement.ToppingType topping;

public CustomPizza cookPizza() {
log.info("COOKING Pizza => " + this); // In OVEN
log.info("COOKING the Pizza => [" + this + "]");
return new CustomPizza(doughType, sauceType, topping);
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/practice/creational/pool/PoolDemo.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public static void main(final String[] arguments) {

objectPool.status(); // CURRENT status

objectPool.remit(personObj3); // REMIT
objectPool.status(); // CURRENT status
objectPool.remit(personObj3); // BACK
objectPool.status(); // FINALE status
}
}
5 changes: 5 additions & 0 deletions src/practice/structural/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Examples of `Structural` Design Patterns with Java

### Pluralsight Course: https://www.pluralsight.com/courses/design-patterns-java-structural

### YouTube Recap Video: https://youtu.be/WxGtmIBZszk?si=GUdKyp6vGiS4g94Q
12 changes: 6 additions & 6 deletions src/practice/structural/composite/HeadDepartment.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,16 @@ public final class HeadDepartment implements Department {
@NonNull
private final String name;

public void addDepartment(Department department) {
departments.add(department);
public void addDepartment(@NonNull final Department department) {
departments.add(department); // ADD any SINGLE element in list
}

public void addDepartments(Department... departments) {
this.departments.addAll(List.of(departments));
public void addDepartments(@NonNull final Department... departments) {
this.departments.addAll(List.of(departments)); // ADD multiple items
}

public void removeDepartment(Department department) {
departments.remove(department);
public void removeDepartment(@NonNull final Department department) {
departments.remove(department); // REMOVE any particular element
}

@Override
Expand Down