├── .github └── FUNDING.yml ├── .gitignore ├── structural ├── proxy │ ├── src │ │ └── main │ │ │ └── java │ │ │ └── net │ │ │ └── emmecilab │ │ │ └── proxy │ │ │ ├── Video.java │ │ │ ├── Client.java │ │ │ ├── ProxyVideo.java │ │ │ └── RealVideo.java │ ├── .gitignore │ └── pom.xml ├── decorator │ ├── src │ │ └── main │ │ │ └── java │ │ │ └── net │ │ │ └── emmecilab │ │ │ └── decorator │ │ │ ├── Shape.java │ │ │ ├── Circle.java │ │ │ ├── Triangle.java │ │ │ ├── Client.java │ │ │ ├── ShapeDecorator.java │ │ │ ├── WhiteBorderColorDecorator.java │ │ │ └── RedBackgroundColorDecorator.java │ ├── .gitignore │ └── pom.xml └── flyweight │ ├── src │ └── main │ │ └── java │ │ └── net │ │ └── emmecilab │ │ └── flyweight │ │ ├── Playground.java │ │ ├── Code.java │ │ ├── JavaPlayground.java │ │ ├── PhpPlayground.java │ │ ├── PythonPlayground.java │ │ ├── Client.java │ │ └── PlaygroundFactory.java │ ├── .gitignore │ └── pom.xml ├── behavioural ├── state │ ├── src │ │ └── main │ │ │ └── java │ │ │ └── net │ │ │ └── emmecilab │ │ │ └── state │ │ │ ├── State.java │ │ │ ├── TVOffState.java │ │ │ ├── TVOnState.java │ │ │ ├── TVContext.java │ │ │ ├── TVRemote.java │ │ │ └── Client.java │ ├── .gitignore │ └── pom.xml ├── observer │ ├── src │ │ └── main │ │ │ └── java │ │ │ └── net │ │ │ └── emmecilab │ │ │ └── observer │ │ │ ├── Observer.java │ │ │ ├── Subject.java │ │ │ ├── Message.java │ │ │ ├── ConcreteObserver.java │ │ │ ├── Client.java │ │ │ └── MessagePublisher.java │ ├── .gitignore │ └── pom.xml ├── command │ ├── src │ │ └── main │ │ │ └── java │ │ │ └── net │ │ │ └── emmecilab │ │ │ └── command │ │ │ ├── Command.java │ │ │ ├── Light.java │ │ │ ├── RemoteControl.java │ │ │ ├── LightOnCommand.java │ │ │ ├── Client.java │ │ │ └── LightOffCommand.java │ ├── .gitignore │ └── pom.xml ├── template-method │ ├── ConcreteClass.java │ └── TemplateClass.java ├── strategy │ ├── src │ │ └── main │ │ │ └── java │ │ │ └── net │ │ │ └── emmecilab │ │ │ └── strategy │ │ │ ├── SavingStrategy.java │ │ │ ├── SaveAsOdf.java │ │ │ ├── SaveAsTxt.java │ │ │ ├── SaveAsPdf.java │ │ │ ├── Client.java │ │ │ └── Document.java │ ├── .gitignore │ └── pom.xml └── memento │ ├── .gitignore │ ├── src │ └── main │ │ └── java │ │ └── net │ │ └── emmecilab │ │ └── memento │ │ ├── Memento.java │ │ ├── CareTaker.java │ │ ├── Originator.java │ │ └── Client.java │ └── pom.xml ├── creational ├── factory │ ├── src │ │ └── main │ │ │ └── java │ │ │ └── net │ │ │ └── emmecilab │ │ │ └── design │ │ │ └── pattern │ │ │ └── factory │ │ │ ├── TipoFigura.java │ │ │ ├── FiguraGeometrica.java │ │ │ ├── Cerchio.java │ │ │ ├── Rettangolo.java │ │ │ ├── Triangolo.java │ │ │ ├── Client.java │ │ │ └── FiguraGeometricaFactory.java │ └── pom.xml └── singleton │ ├── no-multithreading │ └── Singleton.java │ └── multithreading │ ├── src │ └── main │ │ └── java │ │ └── net │ │ └── emmecilab │ │ └── design │ │ └── pattern │ │ └── singleton │ │ ├── Client.java │ │ └── Singleton.java │ └── pom.xml └── README.md /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | custom: https://paypal.me/mcicolella 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /behavioural/strategy/strategy/target/ 2 | /behavioural/memento/target/ 3 | /creational/factory/target/ 4 | -------------------------------------------------------------------------------- /structural/proxy/src/main/java/net/emmecilab/proxy/Video.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.proxy; 2 | 3 | public interface Video { 4 | public void display(); 5 | } 6 | -------------------------------------------------------------------------------- /behavioural/state/src/main/java/net/emmecilab/state/State.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.state; 2 | 3 | public interface State { 4 | 5 | public void doOperation(); 6 | } 7 | -------------------------------------------------------------------------------- /structural/decorator/src/main/java/net/emmecilab/decorator/Shape.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.decorator; 2 | 3 | public interface Shape { 4 | 5 | void draw(); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /structural/flyweight/src/main/java/net/emmecilab/flyweight/Playground.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.flyweight; 2 | 3 | public interface Playground { 4 | public void execute(Code code); 5 | } -------------------------------------------------------------------------------- /behavioural/observer/src/main/java/net/emmecilab/observer/Observer.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.observer; 2 | 3 | public interface Observer { 4 | public void update(Message m); 5 | 6 | } 7 | -------------------------------------------------------------------------------- /behavioural/command/src/main/java/net/emmecilab/command/Command.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.command; 2 | 3 | public interface Command { 4 | 5 | void execute(); 6 | 7 | void undo(); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /behavioural/template-method/ConcreteClass.java: -------------------------------------------------------------------------------- 1 | class ConcreteClass extends TemplateClass { 2 | 3 | @Override 4 | protected void step3() { 5 | System.out.println("Running step 3"); 6 | } 7 | 8 | } 9 | -------------------------------------------------------------------------------- /behavioural/strategy/src/main/java/net/emmecilab/strategy/SavingStrategy.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.strategy; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public interface SavingStrategy { 8 | public void save(String data); 9 | } 10 | -------------------------------------------------------------------------------- /structural/decorator/src/main/java/net/emmecilab/decorator/Circle.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.decorator; 2 | 3 | public class Circle implements Shape { 4 | 5 | @Override 6 | public void draw() { 7 | System.out.println("Shape: Circle"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /behavioural/observer/src/main/java/net/emmecilab/observer/Subject.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.observer; 2 | 3 | public interface Subject { 4 | public void add(Observer o); 5 | 6 | public void remove(Observer o); 7 | 8 | public void notify(Message m); 9 | } 10 | -------------------------------------------------------------------------------- /behavioural/state/src/main/java/net/emmecilab/state/TVOffState.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.state; 2 | 3 | public class TVOffState implements State { 4 | 5 | @Override 6 | public void doOperation() { 7 | System.out.println("TV turned ON"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /behavioural/state/src/main/java/net/emmecilab/state/TVOnState.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.state; 2 | 3 | public class TVOnState implements State { 4 | 5 | @Override 6 | public void doOperation() { 7 | System.out.println("TV turned OFF"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /creational/factory/src/main/java/net/emmecilab/design/pattern/factory/TipoFigura.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.design.pattern.factory; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public enum TipoFigura { 8 | CERCHIO, RETTANGOLO, TRIANGOLO; 9 | } 10 | -------------------------------------------------------------------------------- /structural/decorator/src/main/java/net/emmecilab/decorator/Triangle.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.decorator; 2 | 3 | public class Triangle implements Shape { 4 | 5 | @Override 6 | public void draw() { 7 | System.out.println("Shape: Triangle"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /creational/factory/src/main/java/net/emmecilab/design/pattern/factory/FiguraGeometrica.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.design.pattern.factory; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public interface FiguraGeometrica { 8 | 9 | public void disegna(); 10 | } 11 | -------------------------------------------------------------------------------- /structural/flyweight/src/main/java/net/emmecilab/flyweight/Code.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.flyweight; 2 | 3 | public class Code { 4 | private String code; 5 | 6 | public String getCode() { 7 | return code; 8 | } 9 | 10 | public void setCode(String code) { 11 | this.code = code; 12 | } 13 | } -------------------------------------------------------------------------------- /behavioural/observer/src/main/java/net/emmecilab/observer/Message.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.observer; 2 | 3 | public class Message { 4 | final String messageContent; 5 | 6 | public Message(String m) { 7 | this.messageContent = m; 8 | } 9 | 10 | public String getMessageContent() { 11 | return messageContent; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /structural/decorator/src/main/java/net/emmecilab/decorator/Client.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.decorator; 2 | 3 | public class Client { 4 | 5 | public static void main(String[] args) { 6 | 7 | Shape shape = new WhiteBorderColorDecorator(new RedBackgroundColorDecorator(new Circle())); 8 | 9 | shape.draw(); 10 | 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /structural/proxy/src/main/java/net/emmecilab/proxy/Client.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.proxy; 2 | 3 | public class Client { 4 | 5 | public static void main(String[] args) { 6 | 7 | Video player = new ProxyVideo("test.mp4"); 8 | player.display(); 9 | 10 | System.out.println("Display again"); 11 | 12 | player.display(); 13 | 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /behavioural/command/src/main/java/net/emmecilab/command/Light.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.command; 2 | 3 | public class Light { 4 | 5 | boolean isOn; 6 | 7 | public void on() { 8 | isOn = true; 9 | System.out.println("Light is On"); 10 | } 11 | 12 | public void off() { 13 | isOn = false; 14 | System.out.println("Light is Off"); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /behavioural/strategy/src/main/java/net/emmecilab/strategy/SaveAsOdf.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.strategy; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class SaveAsOdf implements SavingStrategy { 8 | 9 | @Override 10 | public void save(String data) { 11 | System.out.println("Saving '" + data + "' as odf"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /creational/singleton/no-multithreading/Singleton.java: -------------------------------------------------------------------------------- 1 | public class Singleton { 2 | 3 | private static Singleton instance; 4 | 5 | private Singleton() { 6 | } 7 | 8 | public static Singleton getInstance() { 9 | if (instance == null) { 10 | instance = new Singleton(); 11 | } 12 | return instance; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /behavioural/strategy/src/main/java/net/emmecilab/strategy/SaveAsTxt.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.strategy; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class SaveAsTxt implements SavingStrategy { 8 | 9 | @Override 10 | public void save(String data) { 11 | System.out.println("Saving '" + data + "' as txt"); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /behavioural/state/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | 12 | ### IntelliJ IDEA ### 13 | .idea 14 | *.iws 15 | *.iml 16 | *.ipr 17 | 18 | ### NetBeans ### 19 | nbproject/private/ 20 | build/ 21 | nbbuild/ 22 | dist/ 23 | nbdist/ 24 | .nb-gradle/ -------------------------------------------------------------------------------- /structural/proxy/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | 12 | ### IntelliJ IDEA ### 13 | .idea 14 | *.iws 15 | *.iml 16 | *.ipr 17 | 18 | ### NetBeans ### 19 | nbproject/private/ 20 | build/ 21 | nbbuild/ 22 | dist/ 23 | nbdist/ 24 | .nb-gradle/ -------------------------------------------------------------------------------- /behavioural/command/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | 12 | ### IntelliJ IDEA ### 13 | .idea 14 | *.iws 15 | *.iml 16 | *.ipr 17 | 18 | ### NetBeans ### 19 | nbproject/private/ 20 | build/ 21 | nbbuild/ 22 | dist/ 23 | nbdist/ 24 | .nb-gradle/ -------------------------------------------------------------------------------- /behavioural/memento/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | 12 | ### IntelliJ IDEA ### 13 | .idea 14 | *.iws 15 | *.iml 16 | *.ipr 17 | 18 | ### NetBeans ### 19 | nbproject/private/ 20 | build/ 21 | nbbuild/ 22 | dist/ 23 | nbdist/ 24 | .nb-gradle/ -------------------------------------------------------------------------------- /behavioural/observer/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | 12 | ### IntelliJ IDEA ### 13 | .idea 14 | *.iws 15 | *.iml 16 | *.ipr 17 | 18 | ### NetBeans ### 19 | nbproject/private/ 20 | build/ 21 | nbbuild/ 22 | dist/ 23 | nbdist/ 24 | .nb-gradle/ -------------------------------------------------------------------------------- /behavioural/strategy/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | 12 | ### IntelliJ IDEA ### 13 | .idea 14 | *.iws 15 | *.iml 16 | *.ipr 17 | 18 | ### NetBeans ### 19 | nbproject/private/ 20 | build/ 21 | nbbuild/ 22 | dist/ 23 | nbdist/ 24 | .nb-gradle/ -------------------------------------------------------------------------------- /behavioural/strategy/src/main/java/net/emmecilab/strategy/SaveAsPdf.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.strategy; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class SaveAsPdf implements SavingStrategy { 8 | 9 | @Override 10 | public void save(String data) { 11 | System.out.println("New version of Saving '" + data + "' as pdf"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /creational/factory/src/main/java/net/emmecilab/design/pattern/factory/Cerchio.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.design.pattern.factory; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class Cerchio implements FiguraGeometrica { 8 | 9 | @Override 10 | public void disegna() { 11 | System.out.println("Sto disegnando un cerchio"); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /structural/decorator/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | 12 | ### IntelliJ IDEA ### 13 | .idea 14 | *.iws 15 | *.iml 16 | *.ipr 17 | 18 | ### NetBeans ### 19 | nbproject/private/ 20 | build/ 21 | nbbuild/ 22 | dist/ 23 | nbdist/ 24 | .nb-gradle/ -------------------------------------------------------------------------------- /structural/decorator/src/main/java/net/emmecilab/decorator/ShapeDecorator.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.decorator; 2 | 3 | public abstract class ShapeDecorator implements Shape { 4 | 5 | protected Shape shape; 6 | 7 | public ShapeDecorator(Shape shape) { 8 | this.shape = shape; 9 | } 10 | 11 | @Override 12 | public void draw() { 13 | shape.draw(); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /structural/flyweight/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | 12 | ### IntelliJ IDEA ### 13 | .idea 14 | *.iws 15 | *.iml 16 | *.ipr 17 | 18 | ### NetBeans ### 19 | nbproject/private/ 20 | build/ 21 | nbbuild/ 22 | dist/ 23 | nbdist/ 24 | .nb-gradle/ -------------------------------------------------------------------------------- /creational/factory/src/main/java/net/emmecilab/design/pattern/factory/Rettangolo.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.design.pattern.factory; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class Rettangolo implements FiguraGeometrica { 8 | 9 | @Override 10 | public void disegna() { 11 | System.out.println("Sto disegnando un rettangolo"); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /creational/factory/src/main/java/net/emmecilab/design/pattern/factory/Triangolo.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.design.pattern.factory; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class Triangolo implements FiguraGeometrica { 8 | 9 | @Override 10 | public void disegna() { 11 | System.out.println("Sto disegnando un triangolo"); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /structural/flyweight/src/main/java/net/emmecilab/flyweight/JavaPlayground.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.flyweight; 2 | 3 | public class JavaPlayground implements Playground { 4 | public JavaPlayground() { 5 | System.out.println("JavaPlayground created"); 6 | } 7 | 8 | @Override 9 | public void execute(Code code) { 10 | System.out.println("Compiling and executing Java code."); 11 | } 12 | } -------------------------------------------------------------------------------- /behavioural/memento/src/main/java/net/emmecilab/memento/Memento.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.memento; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class Memento { 8 | 9 | private String state; 10 | 11 | public Memento(String state) { 12 | this.state = state; 13 | } 14 | 15 | public String getState() { 16 | return state; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /structural/flyweight/src/main/java/net/emmecilab/flyweight/PhpPlayground.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.flyweight; 2 | 3 | public class PhpPlayground implements Playground { 4 | public PhpPlayground() { 5 | System.out.println("PhpPlayground created"); 6 | } 7 | 8 | @Override 9 | public void execute(Code code) { 10 | System.out.println("Compiling and executing Php code."); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /structural/flyweight/src/main/java/net/emmecilab/flyweight/PythonPlayground.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.flyweight; 2 | 3 | public class PythonPlayground implements Playground { 4 | public PythonPlayground() { 5 | System.out.println("PyhonPlayground created"); 6 | } 7 | 8 | @Override 9 | public void execute(Code code) { 10 | System.out.println("Compiling and executing Python code."); 11 | } 12 | } -------------------------------------------------------------------------------- /behavioural/command/src/main/java/net/emmecilab/command/RemoteControl.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.command; 2 | 3 | public class RemoteControl { 4 | private Command command; 5 | 6 | public void setCommand(Command command) { 7 | this.command = command; 8 | } 9 | 10 | public void pressButton() { 11 | command.execute(); 12 | } 13 | 14 | public void undo() { 15 | command.undo(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /behavioural/observer/src/main/java/net/emmecilab/observer/ConcreteObserver.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.observer; 2 | 3 | public class ConcreteObserver implements Observer { 4 | private String name; 5 | 6 | public ConcreteObserver(String name) { 7 | this.name = name; 8 | } 9 | 10 | @Override 11 | public void update(Message m) { 12 | System.out.println(name + ": received message: " + m.getMessageContent()); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /behavioural/command/src/main/java/net/emmecilab/command/LightOnCommand.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.command; 2 | 3 | public class LightOnCommand implements Command { 4 | 5 | private Light light; 6 | 7 | public LightOnCommand(Light light) { 8 | this.light = light; 9 | } 10 | 11 | @Override 12 | public void execute() { 13 | light.on(); 14 | } 15 | 16 | @Override 17 | public void undo() { 18 | light.off(); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /behavioural/state/src/main/java/net/emmecilab/state/TVContext.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.state; 2 | 3 | public class TVContext implements State { 4 | 5 | private State tvState; 6 | 7 | public void setState(State state) { 8 | this.tvState = state; 9 | } 10 | 11 | public State getState() { 12 | return this.tvState; 13 | } 14 | 15 | @Override 16 | public void doOperation() { 17 | tvState.doOperation(); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /behavioural/command/src/main/java/net/emmecilab/command/Client.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.command; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class Client { 8 | 9 | public static void main(String args[]) { 10 | 11 | RemoteControl rc = new RemoteControl(); 12 | 13 | Light light = new Light(); 14 | 15 | rc.setCommand(new LightOnCommand(light)); 16 | rc.pressButton(); 17 | rc.undo(); 18 | 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /behavioural/command/src/main/java/net/emmecilab/command/LightOffCommand.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.command; 2 | 3 | public class LightOffCommand implements Command { 4 | 5 | private Light light; 6 | 7 | public LightOffCommand(Light light) { 8 | this.light = light; 9 | } 10 | 11 | @Override 12 | public void execute() { 13 | light.off(); 14 | } 15 | 16 | @Override 17 | public void undo() { 18 | light.on(); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /behavioural/state/src/main/java/net/emmecilab/state/TVRemote.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.state; 2 | 3 | public class TVRemote { 4 | private String state = ""; 5 | 6 | public void setState(String state) { 7 | this.state = state; 8 | } 9 | 10 | public void doOperation() { 11 | if (state.equalsIgnoreCase("ON")) { 12 | System.out.println("TV turned OFF"); 13 | } else if (state.equalsIgnoreCase("OFF")) { 14 | System.out.println("TV turned ON"); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /behavioural/strategy/src/main/java/net/emmecilab/strategy/Client.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.strategy; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class Client { 8 | 9 | public static void main(String[] args) { 10 | Document doc = new Document(); 11 | doc.setSavingStrategy(new SaveAsTxt()); 12 | doc.save("Data to save"); 13 | doc.setSavingStrategy(new SaveAsPdf()); 14 | doc.save("Data to save"); 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /structural/proxy/src/main/java/net/emmecilab/proxy/ProxyVideo.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.proxy; 2 | 3 | public class ProxyVideo implements Video { 4 | 5 | private String fileName; 6 | private RealVideo realVideo; 7 | 8 | public ProxyVideo(String fileName) { 9 | this.fileName = fileName; 10 | } 11 | 12 | @Override 13 | public void display() { 14 | if (realVideo == null) { 15 | realVideo = new RealVideo(fileName); 16 | } 17 | realVideo.display(); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /creational/singleton/multithreading/src/main/java/net/emmecilab/design/pattern/singleton/Client.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.design.pattern.singleton; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class Client { 8 | 9 | public static void main(String[] args) { 10 | 11 | Singleton s1 = Singleton.getInstance(); 12 | Singleton s2 = Singleton.getInstance(); 13 | 14 | System.out.println(s1.toString()); 15 | System.out.println(s2.toString()); 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /structural/decorator/src/main/java/net/emmecilab/decorator/WhiteBorderColorDecorator.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.decorator; 2 | 3 | public class WhiteBorderColorDecorator extends ShapeDecorator { 4 | 5 | public WhiteBorderColorDecorator(Shape shape) { 6 | super(shape); 7 | } 8 | 9 | @Override 10 | public void draw() { 11 | shape.draw(); 12 | setWhiteBorder(shape); 13 | } 14 | 15 | private void setWhiteBorder(Shape shape) { 16 | System.out.println("Border color: White"); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /structural/decorator/src/main/java/net/emmecilab/decorator/RedBackgroundColorDecorator.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.decorator; 2 | 3 | public class RedBackgroundColorDecorator extends ShapeDecorator { 4 | 5 | public RedBackgroundColorDecorator(Shape shape) { 6 | super(shape); 7 | } 8 | 9 | @Override 10 | public void draw() { 11 | shape.draw(); 12 | setRedBackground(shape); 13 | } 14 | 15 | private void setRedBackground(Shape shape) { 16 | System.out.println("Background color: Red"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /behavioural/memento/src/main/java/net/emmecilab/memento/CareTaker.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.memento; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 8 | * @author Mauro Cicolella 9 | */ 10 | public class CareTaker { 11 | 12 | private final List mementoList = new ArrayList<>(); 13 | 14 | public void add(Memento state) { 15 | mementoList.add(state); 16 | } 17 | 18 | public Memento get(int index) { 19 | return mementoList.get(index); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /behavioural/observer/src/main/java/net/emmecilab/observer/Client.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.observer; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class Client { 8 | 9 | public static void main(String[] args) { 10 | ConcreteObserver o1 = new ConcreteObserver("Observer 1"); 11 | 12 | MessagePublisher p = new MessagePublisher(); 13 | 14 | p.add(o1); 15 | 16 | p.notify(new Message("First Message")); 17 | 18 | p.remove(o1); 19 | 20 | p.notify(new Message("Second Message")); 21 | 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /structural/proxy/src/main/java/net/emmecilab/proxy/RealVideo.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.proxy; 2 | 3 | public class RealVideo implements Video { 4 | 5 | private String fileName; 6 | 7 | public RealVideo(String fileName) { 8 | this.fileName = fileName; 9 | loadFile(fileName); 10 | } 11 | 12 | private void loadFile(String fileName) { 13 | System.out.println("Loading file " + fileName); 14 | } 15 | 16 | @Override 17 | public void display() { 18 | System.out.println("Displaying video " + fileName); 19 | 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /behavioural/memento/src/main/java/net/emmecilab/memento/Originator.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.memento; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class Originator { 8 | private String state; 9 | 10 | public void setState(String state) { 11 | this.state = state; 12 | } 13 | 14 | public String getState() { 15 | return state; 16 | } 17 | 18 | public Memento saveStateToMemento() { 19 | return new Memento(state); 20 | } 21 | 22 | public void getStateFromMemento(Memento memento) { 23 | state = memento.getState(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /creational/factory/src/main/java/net/emmecilab/design/pattern/factory/Client.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.design.pattern.factory; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class Client { 8 | 9 | public static void main(String[] args) { 10 | 11 | FiguraGeometrica cerchio = FiguraGeometricaFactory.createFiguraGeometrica(TipoFigura.CERCHIO); 12 | cerchio.disegna(); 13 | 14 | FiguraGeometrica triangolo = FiguraGeometricaFactory.createFiguraGeometrica(TipoFigura.TRIANGOLO); 15 | triangolo.disegna(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /behavioural/strategy/src/main/java/net/emmecilab/strategy/Document.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.strategy; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class Document { 8 | 9 | private SavingStrategy strategy; 10 | 11 | public Document() { 12 | } 13 | 14 | public Document(SavingStrategy strategy) { 15 | this.strategy = strategy; 16 | } 17 | 18 | public void setSavingStrategy(SavingStrategy strategy) { 19 | this.strategy = strategy; 20 | } 21 | 22 | public void save(String data) { 23 | strategy.save(data); 24 | 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /behavioural/observer/src/main/java/net/emmecilab/observer/MessagePublisher.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.observer; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class MessagePublisher implements Subject { 7 | 8 | private List observers = new ArrayList<>(); 9 | 10 | @Override 11 | public void add(Observer o) { 12 | observers.add(o); 13 | } 14 | 15 | @Override 16 | public void remove(Observer o) { 17 | observers.remove(o); 18 | } 19 | 20 | @Override 21 | public void notify(Message m) { 22 | for (Observer o : observers) { 23 | o.update(m); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /creational/singleton/multithreading/src/main/java/net/emmecilab/design/pattern/singleton/Singleton.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.design.pattern.singleton; 2 | 3 | public class Singleton { 4 | 5 | private volatile static Singleton instance; 6 | 7 | private Singleton() { 8 | } 9 | 10 | public static Singleton getInstance() { 11 | if (instance == null) { 12 | synchronized (Singleton.class) { 13 | if (instance == null) { 14 | instance = new Singleton(); 15 | } 16 | } 17 | } 18 | return instance; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /behavioural/template-method/TemplateClass.java: -------------------------------------------------------------------------------- 1 | abstract class TemplateClass { 2 | 3 | private void step1() { 4 | System.out.println("Executing step 1"); 5 | } 6 | 7 | private void step2() { 8 | System.out.println("Executing step 2"); 9 | } 10 | 11 | // this method should be implemented inside the derived class 12 | protected abstract void step3(); 13 | 14 | private void step4() { 15 | System.out.println("Executing step 4"); 16 | } 17 | 18 | // Skeleton of the algorithm 19 | public final void algorithm() { 20 | step1(); 21 | step2(); 22 | step3(); 23 | step4(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /creational/factory/src/main/java/net/emmecilab/design/pattern/factory/FiguraGeometricaFactory.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.design.pattern.factory; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class FiguraGeometricaFactory { 8 | 9 | public static FiguraGeometrica createFiguraGeometrica(TipoFigura figura) { 10 | switch (figura) { 11 | case CERCHIO: 12 | return new Cerchio(); 13 | 14 | case RETTANGOLO: 15 | return new Rettangolo(); 16 | 17 | case TRIANGOLO: 18 | return new Triangolo(); 19 | 20 | default: 21 | return null; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /behavioural/observer/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | net.emmecilab 5 | observer 6 | 1.0-SNAPSHOT 7 | jar 8 | 9 | UTF-8 10 | 11 11 | 11 12 | 13 | -------------------------------------------------------------------------------- /behavioural/state/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | net.emmecilab 5 | state 6 | 1.0-SNAPSHOT 7 | jar 8 | 9 | UTF-8 10 | 11 11 | 11 12 | 13 | 14 | -------------------------------------------------------------------------------- /behavioural/strategy/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | net.emmecilab 5 | strategy 6 | 1.0-SNAPSHOT 7 | jar 8 | 9 | UTF-8 10 | 11 11 | 11 12 | 13 | -------------------------------------------------------------------------------- /structural/proxy/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | net.emmecilab 5 | proxy 6 | 1.0-SNAPSHOT 7 | jar 8 | 9 | UTF-8 10 | 11 11 | 11 12 | 13 | 14 | -------------------------------------------------------------------------------- /behavioural/command/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | net.emmecilab 5 | command 6 | 1.0-SNAPSHOT 7 | jar 8 | 9 | UTF-8 10 | 11 11 | 11 12 | 13 | command 14 | -------------------------------------------------------------------------------- /behavioural/memento/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | net.emmecilab 5 | memento 6 | 1.0-SNAPSHOT 7 | jar 8 | 9 | UTF-8 10 | 11 11 | 11 12 | 13 | memento 14 | -------------------------------------------------------------------------------- /behavioural/state/src/main/java/net/emmecilab/state/Client.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.state; 2 | 3 | public class Client { 4 | 5 | public static void main(String[] args) { 6 | 7 | // without State pattern 8 | System.out.println("Without State pattern"); 9 | TVRemote remote = new TVRemote(); 10 | remote.setState("ON"); 11 | remote.doOperation(); 12 | remote.setState("OFF"); 13 | remote.doOperation(); 14 | 15 | // with State pattern 16 | System.out.println("With State pattern"); 17 | TVContext context = new TVContext(); 18 | State tvOnState = new TVOnState(); 19 | State tvOffState = new TVOffState(); 20 | context.setState(tvOnState); 21 | context.doOperation(); 22 | context.setState(tvOffState); 23 | context.doOperation(); 24 | 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /creational/factory/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | net.emmecilab 5 | design-pattern-factory 6 | 1.0-SNAPSHOT 7 | jar 8 | 9 | UTF-8 10 | 11 11 | 11 12 | 13 | design-pattern-factory 14 | -------------------------------------------------------------------------------- /creational/singleton/multithreading/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | net.emmecilab 5 | design-pattern-singleton 6 | 1.0-SNAPSHOT 7 | jar 8 | 9 | UTF-8 10 | 11 11 | 11 12 | 13 | design-pattern-singleton 14 | 15 | -------------------------------------------------------------------------------- /structural/flyweight/src/main/java/net/emmecilab/flyweight/Client.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.flyweight; 2 | 3 | public class Client { 4 | 5 | public static void main(String[] args) { 6 | Code code = new Code(); 7 | 8 | code.setCode("JAVA Code..."); 9 | Playground playground = PlaygroundFactory.getPlayground("JAVA"); 10 | playground.execute(code); 11 | System.out.println("*************************"); 12 | 13 | code.setCode("PHP Code..."); 14 | playground = PlaygroundFactory.getPlayground("PHP"); 15 | playground.execute(code); 16 | System.out.println("*************************"); 17 | 18 | code.setCode("JAVA Code..."); 19 | playground = PlaygroundFactory.getPlayground("JAVA"); 20 | playground.execute(code); 21 | System.out.println("*************************"); 22 | 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /structural/flyweight/src/main/java/net/emmecilab/flyweight/PlaygroundFactory.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.flyweight; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | public final class PlaygroundFactory { 7 | 8 | private static Map map = new HashMap<>(); 9 | 10 | private PlaygroundFactory() { 11 | throw new AssertionError("Cannot instantiate the class"); 12 | } 13 | 14 | public static synchronized Playground getPlayground(String playgroundType) { 15 | Playground playground = map.get(playgroundType); 16 | 17 | if (playground == null) { 18 | switch (playgroundType) { 19 | 20 | case "JAVA": 21 | playground = new JavaPlayground(); 22 | break; 23 | 24 | case "PHP": 25 | playground = new PhpPlayground(); 26 | break; 27 | 28 | case "PYTHON": 29 | playground = new PythonPlayground(); 30 | break; 31 | 32 | } 33 | map.put(playgroundType, playground); 34 | } 35 | return playground; 36 | } 37 | } -------------------------------------------------------------------------------- /structural/decorator/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | net.emmecilab 5 | decorator 6 | 1.0-SNAPSHOT 7 | jar 8 | 9 | UTF-8 10 | 11 11 | 11 12 | 13 | 14 | 15 | 16 | org.apache.maven.plugins 17 | maven-jar-plugin 18 | 3.2.2 19 | 20 | 21 | 22 | net.emmecilab.decorator.Client 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /structural/flyweight/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | net.emmecilab 5 | flyweight 6 | 1.0-SNAPSHOT 7 | jar 8 | 9 | UTF-8 10 | 11 11 | 11 12 | 13 | 14 | 15 | 16 | org.apache.maven.plugins 17 | maven-jar-plugin 18 | 3.2.2 19 | 20 | 21 | 22 | net.emmecilab.flyweight.Client 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /behavioural/memento/src/main/java/net/emmecilab/memento/Client.java: -------------------------------------------------------------------------------- 1 | package net.emmecilab.memento; 2 | 3 | /** 4 | * 5 | * @author Mauro Cicolella 6 | */ 7 | public class Client { 8 | 9 | public static void main(String args[]) { 10 | 11 | Originator originator = new Originator(); 12 | CareTaker careTaker = new CareTaker(); 13 | 14 | //Set initial originator state 15 | originator.setState("State 1"); 16 | //Save state to careTaker 17 | careTaker.add(originator.saveStateToMemento()); 18 | 19 | //Change current state 20 | originator.setState("State 2"); 21 | //Save to careTaker 22 | careTaker.add(originator.saveStateToMemento()); 23 | 24 | //Change current state 25 | originator.setState("State 3"); 26 | //Save to careTaker 27 | careTaker.add(originator.saveStateToMemento()); 28 | 29 | System.out.println("Current State is: " + originator.getState()); 30 | 31 | originator.getStateFromMemento(careTaker.get(0)); 32 | System.out.println("Initial state : " + originator.getState()); 33 | 34 | 35 | 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Design patterns in Java 2 | 3 |

4 | 5 | 6 | 7 | 8 | * [Decorator](https://www.emmecilab.net/blog/design-patterns-in-java-decorator) - [:movie_camera:](https://youtu.be/55vFAnLfRJ4) 9 | * [Factory](https://www.emmecilab.net/blog/design-patterns-in-java-factory/) - [:movie_camera:](https://youtu.be/zDVoYMPWyPo) 10 | * [Observer](https://www.emmecilab.net/blog/design-patterns-in-java-observer) - [:movie_camera:](https://youtu.be/O-QfeaSHjeQ) 11 | * [Singleton](https://www.emmecilab.net/blog/design-patterns-in-java-singleton/) - [:movie_camera:](https://youtu.be/RGQ3Zf6-M7s) 12 | * [State](https://www.emmecilab.net/blog/design-patterns-in-java-state) - [:movie_camera:](https://youtu.be/2qWjBPx2yhQ) 13 | * Strategy - [:movie_camera:](https://youtu.be/qsC6S29dE48) 14 | * [Template Method](https://www.emmecilab.net/blog/design-patterns-in-java-template-method/) - [:movie_camera:](https://youtu.be/JH28N9oWi-Y) 15 | 16 | ## Recommended books 17 | * [Head First Design Patterns (ENG)](https://amzn.to/41SJ7gR) 18 | * [Elements of Reusable Object-Oriented Software (ENG)](https://amzn.to/3DtBC6N) 19 | * [Design patterns (ITA)](https://amzn.to/4hqCoPG) 20 | 21 | ## Other interesting repos 22 | * [Docker examples](https://github.com/mcicolella/docker-examples) 23 | * [Spring Batch examples](https://github.com/mcicolella/spring-batch-examples) 24 | * [Spring framework examples](https://github.com/mcicolella/spring-framework-examples) 25 | * [Corso JPA](https://github.com/mcicolella/corso-jpa-java-persistence-api) 26 | * [Esercitazioni Spring Boot](https://github.com/mcicolella/esercitazioni-spring-boot) 27 | * [Kubernetes examples](https://github.com/mcicolella/kubernetes-examples) 28 | 29 | --------------------------------------------------------------------------------