├── .gitignore ├── Behavioral ├── ChainOfResponsibility │ ├── ChainOfResponsibility │ │ ├── CEO.java │ │ ├── ChainOfResponsibilityDemo.java │ │ ├── ChainOfResponsibilityEverydayDemo.java │ │ ├── Director.java │ │ ├── Handler.java │ │ ├── Request.java │ │ ├── RequestType.java │ │ └── VP.java │ └── chain-of-responsibility.pdf ├── Command │ ├── Command │ │ ├── AllLightsCommand.java │ │ ├── Command.java │ │ ├── CommandDemo.java │ │ ├── CommandEverydayDemo.java │ │ ├── Light.java │ │ ├── OnCommand.java │ │ ├── Switch.java │ │ └── ToggleCommand.java │ └── command.pdf ├── Interpreter │ ├── Interpreter │ │ ├── AndExpression.java │ │ ├── Expression.java │ │ ├── InterpreterDemo.java │ │ ├── InterpreterEverydayDemo.java │ │ ├── OrExpression.java │ │ └── TerminalExpression.java │ └── interpreter.pdf ├── Iterator │ ├── Iterator │ │ ├── BikeRepository.java │ │ ├── IteratorDemo.java │ │ └── IteratorEverydayDemo.java │ └── iterator.pdf ├── Mediator │ ├── Mediator │ │ ├── Command.java │ │ ├── Light.java │ │ ├── Mediator.java │ │ ├── MediatorDemo.java │ │ ├── MediatorEverydayDemo.java │ │ ├── TurnOffAllLightsCommand.java │ │ └── TurnOnAllLightsCommand.java │ └── mediator.pdf ├── Memento │ ├── Memento │ │ ├── Caretaker.java │ │ ├── Employee.java │ │ ├── EmployeeMemento.java │ │ ├── MementoDemo.java │ │ └── MementoEverydayDemo.java │ └── memento.pdf ├── Observer │ ├── Observer │ │ ├── MessageStream.java │ │ ├── Observer.java │ │ ├── ObserverDemo.java │ │ ├── ObserverEverydayDemo.java │ │ ├── PhoneClient.java │ │ ├── Subject.java │ │ └── TabletClient.java │ └── observer.pdf ├── State │ ├── State │ │ ├── Fan.java │ │ ├── FanHighState.java │ │ ├── FanLowState.java │ │ ├── FanMedState.java │ │ ├── FanOffState.java │ │ ├── State.java │ │ └── StateDemo.java │ └── state.pdf ├── Strategy │ ├── Strategy │ │ ├── AmexStrategy.java │ │ ├── CreditCard.java │ │ ├── Person.java │ │ ├── StrategyDemo.java │ │ ├── StrategyEverydayDemo.java │ │ ├── ValidationStrategy.java │ │ └── VisaStrategy.java │ └── strategy.pdf ├── TemplateMethod │ ├── TemplateMethod │ │ ├── OrderTemplate.java │ │ ├── Person.java │ │ ├── StoreOrder.java │ │ ├── TemplateDemo.java │ │ ├── TemplateEverydayDemo.java │ │ └── WebOrder.java │ └── template-method.pdf └── Visitor │ ├── Visitor │ ├── AtvPart.java │ ├── AtvPartVisitor.java │ ├── AtvPartsDisplayVisitor.java │ ├── AtvPartsShippingVisitor.java │ ├── Fender.java │ ├── Oil.java │ ├── PartsOrder.java │ ├── VisitorBad │ │ ├── AtvPart.java │ │ ├── Fender.java │ │ ├── Oil.java │ │ ├── PartsOrder.java │ │ ├── VisitorDemo.java │ │ └── Wheel.java │ ├── VisitorDemo.java │ └── Wheel.java │ └── visitor.pdf ├── Creational ├── AbstractFactory │ ├── AbstractFactory │ │ ├── AbstractFactoryDemo.java │ │ ├── AbstractFactoryEverydayDemo.java │ │ ├── AmexFactory.java │ │ ├── AmexGoldCreditCard.java │ │ ├── AmexGoldValidator.java │ │ ├── AmexPlatinumCreditCard.java │ │ ├── AmexPlatinumValidator.java │ │ ├── CardType.java │ │ ├── CreditCard.java │ │ ├── CreditCardFactory.java │ │ ├── Validator.java │ │ ├── VisaBlackCreditCard.java │ │ ├── VisaCreditCard.java │ │ ├── VisaFactory.java │ │ ├── VisaGoldCreditCard.java │ │ └── VisaValidator.java │ └── abstract-factory.pdf ├── Builder │ ├── Builder │ │ ├── BuilderEverydayDemo.java │ │ ├── BuilderLunchOrderDemo.java │ │ ├── LunchOrder.java │ │ ├── LunchOrderBean.java │ │ ├── LunchOrderBeanDemo.java │ │ ├── LunchOrderTele.java │ │ └── LunchOrderTeleDemo.java │ └── builder.pdf ├── FactoryMethod │ ├── FactoryMethod │ │ ├── AboutPage.java │ │ ├── Blog.java │ │ ├── CartPage.java │ │ ├── CommentPage.java │ │ ├── ContactPage.java │ │ ├── FactoryDemo.java │ │ ├── FactoryEverydayDemo.java │ │ ├── ItemPage.java │ │ ├── Page.java │ │ ├── PostPage.java │ │ ├── SearchPage.java │ │ ├── Shop.java │ │ ├── Website.java │ │ ├── WebsiteFactory.java │ │ └── WebsiteType.java │ └── factory.pdf ├── Prototype │ ├── Prototype │ │ ├── Book.java │ │ ├── Item.java │ │ ├── Movie.java │ │ ├── PrototypeDemo.java │ │ ├── PrototypeEverydayDemo.java │ │ ├── Record.java │ │ ├── Registry.java │ │ └── Statement.java │ └── prototype.pdf └── Singleton │ ├── Singleton │ ├── DbSingleton.java │ ├── DbSingletonDemo.java │ └── SingletonEverydayDemo.java │ └── singleton.pdf ├── README.md ├── Structural ├── Adapter │ ├── Adapter │ │ ├── AdapterDemo.java │ │ ├── AdapterEverydayDemo.java │ │ ├── Employee.java │ │ ├── EmployeeAdapterCSV.java │ │ ├── EmployeeAdapterLdap.java │ │ ├── EmployeeCSV.java │ │ ├── EmployeeClient.java │ │ ├── EmployeeDB.java │ │ └── EmployeeLdap.java │ └── adapter.pdf ├── Bridge │ ├── Bridge │ │ ├── BridgeDemo.java │ │ ├── BridgeEverydayDemo.java │ │ ├── Detail.java │ │ ├── Formatter.java │ │ ├── HtmlFormatter.java │ │ ├── Movie.java │ │ ├── MoviePrinter.java │ │ ├── PrintFormatter.java │ │ ├── Printer.java │ │ ├── shape1 │ │ │ ├── BlueCircle.java │ │ │ ├── BlueSquare.java │ │ │ ├── Circle.java │ │ │ ├── GreenSquare.java │ │ │ ├── RedCircle.java │ │ │ ├── RedSquare.java │ │ │ ├── Shape.java │ │ │ ├── Shape1BridgeDemo.java │ │ │ └── Square.java │ │ └── shape2 │ │ │ ├── Blue.java │ │ │ ├── Circle.java │ │ │ ├── Color.java │ │ │ ├── Green.java │ │ │ ├── Red.java │ │ │ ├── Shape.java │ │ │ ├── Shape2BridgeDemo.java │ │ │ └── Square.java │ └── bridge.pdf ├── Composite │ ├── Composite │ │ ├── CompositeEverydayDemo.java │ │ ├── CompositeMenuDemo.java │ │ ├── Menu.java │ │ ├── MenuComponent.java │ │ └── MenuItem.java │ └── composite.pdf ├── Decorator │ ├── Decorator │ │ ├── DecoratorEverydayDemo.java │ │ ├── DecoratorSandwichDemo.java │ │ ├── DressingDecorator.java │ │ ├── MeatDecorator.java │ │ ├── Sandwich.java │ │ ├── SandwichDecorator.java │ │ └── SimpleSandwich.java │ └── decorator.pdf ├── Facade │ ├── Facade │ │ ├── DbSingleton.java │ │ ├── FacadeEverydayDemo.java │ │ ├── FacadeJdbcDemo.java │ │ ├── JdbcDemo.java │ │ └── JdbcFacade.java │ └── facade.pdf ├── Flyweight │ ├── Flyweight │ │ ├── Catalog.java │ │ ├── FlyweightEverydayDemo.java │ │ ├── FlyweightInventoryDemo.java │ │ ├── InventorySystem.java │ │ ├── Item.java │ │ └── Order.java │ └── flyweight.pdf └── Proxy │ ├── Proxy │ ├── SecurityProxy.java │ ├── TwitterDemo.java │ ├── TwitterExample.java │ ├── TwitterService.java │ ├── TwitterServiceImpl.java │ └── TwitterServiceStub.java │ └── proxy.pdf └── libs ├── derby.jar └── derbyclient.jar /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *.iml 3 | out 4 | -------------------------------------------------------------------------------- /Behavioral/ChainOfResponsibility/ChainOfResponsibility/CEO.java: -------------------------------------------------------------------------------- 1 | package ChainOfResponsibility; 2 | 3 | public class CEO extends Handler { 4 | 5 | @Override 6 | public void handleRequest(Request request) { 7 | System.out.println("CEOs can approve anything they want"); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Behavioral/ChainOfResponsibility/ChainOfResponsibility/ChainOfResponsibilityDemo.java: -------------------------------------------------------------------------------- 1 | package ChainOfResponsibility; 2 | 3 | 4 | public class ChainOfResponsibilityDemo { 5 | 6 | public static void main(String[] args) { 7 | Director bryan = new Director(); 8 | VP crystal = new VP(); 9 | CEO jeff = new CEO(); 10 | 11 | bryan.setSuccessor(crystal); 12 | crystal.setSuccessor(jeff); 13 | 14 | Request request = new Request(RequestType.CONFERENCE, 500); 15 | bryan.handleRequest(request); 16 | 17 | request = new Request(RequestType.PURCHASE, 1000); 18 | crystal.handleRequest(request); 19 | 20 | request = new Request(RequestType.PURCHASE, 2000); 21 | bryan.handleRequest(request); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Behavioral/ChainOfResponsibility/ChainOfResponsibility/ChainOfResponsibilityEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package ChainOfResponsibility; 2 | 3 | import java.util.logging.ConsoleHandler; 4 | import java.util.logging.Level; 5 | import java.util.logging.Logger; 6 | 7 | 8 | public class ChainOfResponsibilityEverydayDemo { 9 | 10 | private static final Logger logger = Logger.getLogger(ChainOfResponsibilityEverydayDemo.class.getName()); 11 | 12 | public static void main(String args[]) { 13 | 14 | //level to log at 15 | logger.setLevel(Level.FINER); 16 | 17 | ConsoleHandler handler = new ConsoleHandler(); 18 | //level to publish at 19 | handler.setLevel(Level.FINER); 20 | logger.addHandler(handler); 21 | 22 | logger.finest("Finest level of logging"); //this one won't print 23 | logger.finer("Finer level, but not as fine as finest"); 24 | logger.fine("Fine, but not as fine as finer or finest"); 25 | 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Behavioral/ChainOfResponsibility/ChainOfResponsibility/Director.java: -------------------------------------------------------------------------------- 1 | package ChainOfResponsibility; 2 | 3 | public class Director extends Handler { 4 | 5 | @Override 6 | public void handleRequest(Request request) { 7 | if(request.getRequestType() == RequestType.CONFERENCE) { 8 | System.out.println("Directors can approve conferences"); 9 | } 10 | else { 11 | successor.handleRequest(request); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Behavioral/ChainOfResponsibility/ChainOfResponsibility/Handler.java: -------------------------------------------------------------------------------- 1 | package ChainOfResponsibility; 2 | 3 | public abstract class Handler { 4 | 5 | protected Handler successor; 6 | 7 | public void setSuccessor(Handler successor) { 8 | this.successor = successor; 9 | } 10 | 11 | public abstract void handleRequest(Request request); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /Behavioral/ChainOfResponsibility/ChainOfResponsibility/Request.java: -------------------------------------------------------------------------------- 1 | package ChainOfResponsibility; 2 | 3 | public class Request { 4 | 5 | private RequestType requestType; 6 | private double amount; 7 | 8 | public Request(RequestType requestType, double amount) { 9 | this.requestType = requestType; 10 | this.amount = amount; 11 | } 12 | 13 | public RequestType getRequestType() { 14 | return requestType; 15 | } 16 | 17 | public double getAmount() { 18 | return amount; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Behavioral/ChainOfResponsibility/ChainOfResponsibility/RequestType.java: -------------------------------------------------------------------------------- 1 | package ChainOfResponsibility; 2 | 3 | public enum RequestType { 4 | CONFERENCE, PURCHASE; 5 | } 6 | -------------------------------------------------------------------------------- /Behavioral/ChainOfResponsibility/ChainOfResponsibility/VP.java: -------------------------------------------------------------------------------- 1 | package ChainOfResponsibility; 2 | 3 | public class VP extends Handler { 4 | 5 | @Override 6 | public void handleRequest(Request request) { 7 | if(request.getRequestType() == RequestType.PURCHASE) { 8 | if(request.getAmount() < 1500) { 9 | System.out.println("VPs can approve purchases below 1500"); 10 | } 11 | else { 12 | successor.handleRequest(request); 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Behavioral/ChainOfResponsibility/chain-of-responsibility.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Behavioral/ChainOfResponsibility/chain-of-responsibility.pdf -------------------------------------------------------------------------------- /Behavioral/Command/Command/AllLightsCommand.java: -------------------------------------------------------------------------------- 1 | package Command; 2 | 3 | import java.util.List; 4 | 5 | public class AllLightsCommand implements Command { 6 | 7 | private List lights; 8 | 9 | public AllLightsCommand(List lights) { 10 | this.lights = lights; 11 | } 12 | 13 | @Override 14 | public void execute() { 15 | for (Light light : lights) { 16 | if(light.isOn()) { 17 | light.toggle(); 18 | } 19 | } 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /Behavioral/Command/Command/Command.java: -------------------------------------------------------------------------------- 1 | package Command; 2 | 3 | //Command 4 | public interface Command { 5 | 6 | public void execute(); 7 | 8 | } 9 | -------------------------------------------------------------------------------- /Behavioral/Command/Command/CommandDemo.java: -------------------------------------------------------------------------------- 1 | package Command; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | //client 7 | public class CommandDemo { 8 | 9 | public static void main(String args[]) { 10 | Light bedroomLight = new Light(); 11 | Light kitchenLight = new Light(); 12 | Switch lightSwitch = new Switch(); 13 | 14 | Command toggleCommand = new ToggleCommand(bedroomLight); 15 | 16 | lightSwitch.storeAndExecute(toggleCommand); 17 | //lightSwitch.storeAndExecute(toggleCommand); 18 | //lightSwitch.storeAndExecute(toggleCommand); 19 | 20 | List lights = new ArrayList<>(); 21 | lights.add(kitchenLight); 22 | lights.add(bedroomLight); 23 | Command allLightsCommand = new AllLightsCommand(lights); 24 | 25 | lightSwitch.storeAndExecute(allLightsCommand); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Behavioral/Command/Command/CommandEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Command; 2 | 3 | public class CommandEverydayDemo { 4 | 5 | public static void main(String[] args) { 6 | Task task1 = new Task(10, 12); //encapsulates request 7 | Task task2 = new Task(11, 13); 8 | 9 | Thread thread1 = new Thread(task1); 10 | thread1.start(); //invoker 11 | 12 | Thread thread2 = new Thread(task2); 13 | thread2.start(); 14 | } 15 | } 16 | 17 | class Task implements Runnable { 18 | 19 | int num1; 20 | int num2; 21 | 22 | Task(int num1, int num2) { 23 | this.num1 = num1; 24 | this.num2 = num2; 25 | } 26 | 27 | @Override 28 | public void run() { //execute method 29 | System.out.println(num1 * num2); //receiver 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Behavioral/Command/Command/Light.java: -------------------------------------------------------------------------------- 1 | package Command; 2 | 3 | //receiver 4 | public class Light { 5 | 6 | private boolean isOn = false; 7 | 8 | public boolean isOn() { 9 | return isOn; 10 | } 11 | 12 | public void toggle() { 13 | if(isOn) { 14 | off(); 15 | isOn = false; 16 | } 17 | else { 18 | on(); 19 | isOn = true; 20 | } 21 | } 22 | 23 | public void on() { 24 | System.out.println("Light switched on."); 25 | } 26 | 27 | public void off() { 28 | System.out.println("Light switched off."); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Behavioral/Command/Command/OnCommand.java: -------------------------------------------------------------------------------- 1 | package Command; 2 | 3 | //concrete Command 4 | public class OnCommand implements Command { 5 | 6 | private Light light; 7 | 8 | public OnCommand(Light light) { 9 | this.light = light; 10 | } 11 | 12 | @Override 13 | public void execute() { 14 | light.on(); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /Behavioral/Command/Command/Switch.java: -------------------------------------------------------------------------------- 1 | package Command; 2 | 3 | //invoker 4 | public class Switch { 5 | 6 | public void storeAndExecute(Command command) { 7 | command.execute(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Behavioral/Command/Command/ToggleCommand.java: -------------------------------------------------------------------------------- 1 | package Command; 2 | 3 | //concrete Command 4 | public class ToggleCommand implements Command { 5 | 6 | private Light light; 7 | 8 | public ToggleCommand(Light light) { 9 | this.light = light; 10 | } 11 | 12 | @Override 13 | public void execute() { 14 | light.toggle(); 15 | } 16 | } -------------------------------------------------------------------------------- /Behavioral/Command/command.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Behavioral/Command/command.pdf -------------------------------------------------------------------------------- /Behavioral/Interpreter/Interpreter/AndExpression.java: -------------------------------------------------------------------------------- 1 | package Interpreter; 2 | 3 | public class AndExpression implements Expression { 4 | 5 | private Expression expr1 = null; 6 | private Expression expr2 = null; 7 | 8 | public AndExpression(Expression expr1, Expression expr2) { 9 | this.expr1 = expr1; 10 | this.expr2 = expr2; 11 | } 12 | 13 | @Override 14 | public boolean interpret(String context) { 15 | return expr1.interpret(context) && expr2.interpret(context); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Behavioral/Interpreter/Interpreter/Expression.java: -------------------------------------------------------------------------------- 1 | package Interpreter; 2 | 3 | public interface Expression { 4 | public boolean interpret(String context); 5 | } 6 | -------------------------------------------------------------------------------- /Behavioral/Interpreter/Interpreter/InterpreterDemo.java: -------------------------------------------------------------------------------- 1 | package Interpreter; 2 | 3 | public class InterpreterDemo { 4 | 5 | static Expression buildInterpreterTree() { 6 | 7 | Expression terminal1 = new TerminalExpression("Lions"); 8 | Expression terminal2 = new TerminalExpression("Tigers"); 9 | Expression terminal3 = new TerminalExpression("Bears"); 10 | 11 | // Tigers and Bears 12 | Expression alternation1 = new AndExpression(terminal2, terminal3); 13 | 14 | //Lions or (Tigers and Bears) 15 | Expression alternation2 = new OrExpression(terminal1, alternation1); 16 | 17 | return new AndExpression(terminal3, alternation2); 18 | } 19 | 20 | /** 21 | * main method - build the Interpreter and then interpret a specific 22 | * sequence 23 | * 24 | * @param args 25 | */ 26 | public static void main(String[] args) { 27 | 28 | //String context = "Lions"; 29 | //String context = "Tigers"; 30 | //String context = "Bears"; 31 | //String context = "Lions Tigers"; 32 | //String context = "Lions Bears"; 33 | String context = "Tigers Bears"; 34 | 35 | Expression define = buildInterpreterTree(); 36 | 37 | System.out.println(context + " is " + define.interpret(context)); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Behavioral/Interpreter/Interpreter/InterpreterEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Interpreter; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | public class InterpreterEverydayDemo { 7 | 8 | public static void main(String[] args) { 9 | String input = "Lions, and tigers, and bears! Oh, my!"; 10 | 11 | Pattern p = Pattern.compile("(lion|cat|dog|wolf|bear|human|tiger|liger|Lion)"); 12 | Matcher m = p.matcher(input); 13 | 14 | while (m.find()) { 15 | System.out.println("Found a " + m.group() + "."); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Behavioral/Interpreter/Interpreter/OrExpression.java: -------------------------------------------------------------------------------- 1 | package Interpreter; 2 | 3 | public class OrExpression implements Expression { 4 | 5 | private Expression expr1 = null; 6 | private Expression expr2 = null; 7 | 8 | public OrExpression(Expression expr1, Expression expr2) { 9 | this.expr1 = expr1; 10 | this.expr2 = expr2; 11 | } 12 | 13 | @Override 14 | public boolean interpret(String context) { 15 | return expr1.interpret(context) || expr2.interpret(context); 16 | } 17 | } -------------------------------------------------------------------------------- /Behavioral/Interpreter/Interpreter/TerminalExpression.java: -------------------------------------------------------------------------------- 1 | package Interpreter; 2 | 3 | import java.util.StringTokenizer; 4 | 5 | public class TerminalExpression implements Expression { 6 | 7 | private String data; 8 | 9 | public TerminalExpression(String data) { 10 | this.data = data; 11 | } 12 | 13 | public boolean interpret(String str) { 14 | StringTokenizer st = new StringTokenizer(str); 15 | while (st.hasMoreTokens()) { 16 | String test = st.nextToken(); 17 | if (test.equals(data)) { 18 | return true; 19 | } 20 | } 21 | return false; 22 | } 23 | } -------------------------------------------------------------------------------- /Behavioral/Interpreter/interpreter.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Behavioral/Interpreter/interpreter.pdf -------------------------------------------------------------------------------- /Behavioral/Iterator/Iterator/BikeRepository.java: -------------------------------------------------------------------------------- 1 | package Iterator; 2 | 3 | import java.util.Iterator; 4 | 5 | 6 | public class BikeRepository implements Iterable { 7 | 8 | private String [] bikes; 9 | private int index; 10 | 11 | public BikeRepository() { 12 | bikes = new String[10]; 13 | index = 0; 14 | } 15 | 16 | public void addBike(String bike) { 17 | if(index == bikes.length) { 18 | String [] largerBikes = new String[bikes.length + 5]; 19 | System.arraycopy( bikes, 0, largerBikes, 0, bikes.length ); 20 | bikes = largerBikes; 21 | largerBikes = null; 22 | } 23 | 24 | bikes[index] = bike; 25 | index++; 26 | } 27 | 28 | @Override 29 | public Iterator iterator() { 30 | Iterator it = new Iterator() { 31 | 32 | private int currentIndex = 0; 33 | 34 | @Override 35 | public boolean hasNext() { 36 | return currentIndex < bikes.length && bikes[currentIndex] != null; 37 | } 38 | 39 | @Override 40 | public String next() { 41 | return bikes[currentIndex++]; 42 | } 43 | 44 | @Override 45 | public void remove() { 46 | throw new UnsupportedOperationException(); 47 | } 48 | 49 | }; 50 | 51 | return it; 52 | } 53 | } -------------------------------------------------------------------------------- /Behavioral/Iterator/Iterator/IteratorDemo.java: -------------------------------------------------------------------------------- 1 | package Iterator; 2 | 3 | import java.util.Iterator; 4 | 5 | public class IteratorDemo { 6 | 7 | public static void main(String[] args) { 8 | 9 | BikeRepository repo = new BikeRepository(); 10 | 11 | repo.addBike("Cervelo"); 12 | repo.addBike("Scott"); 13 | repo.addBike("Fuji"); 14 | 15 | Iterator bikeIterator = repo.iterator(); 16 | 17 | //while(bikeIterator.hasNext()) { 18 | // System.out.println(bikeIterator.next()); 19 | //} 20 | 21 | for (String bike : repo) { 22 | System.out.println(bike); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Behavioral/Iterator/Iterator/IteratorEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Iterator; 2 | 3 | import java.util.HashSet; 4 | import java.util.Iterator; 5 | import java.util.Set; 6 | 7 | public class IteratorEverydayDemo { 8 | 9 | public static void main(String[] args) { 10 | //List names = new ArrayList<>(); 11 | Set names = new HashSet<>(); 12 | 13 | names.add("Bryan"); 14 | names.add("Aaron"); 15 | names.add("Jason"); 16 | 17 | Iterator namesItr = names.iterator(); 18 | 19 | //for(int i = 0; i < names.size(); i++) { 20 | // String name = names.get(i); 21 | //} 22 | 23 | //for (String name : names) { 24 | // System.out.println(name); 25 | //} 26 | 27 | while(namesItr.hasNext()) { 28 | String name = namesItr.next(); 29 | System.out.println(name); 30 | namesItr.remove(); 31 | } 32 | 33 | System.out.println("Names size: " + names.size()); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Behavioral/Iterator/iterator.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Behavioral/Iterator/iterator.pdf -------------------------------------------------------------------------------- /Behavioral/Mediator/Mediator/Command.java: -------------------------------------------------------------------------------- 1 | package Mediator; 2 | 3 | //colleague 4 | public interface Command { 5 | void execute(); 6 | } 7 | -------------------------------------------------------------------------------- /Behavioral/Mediator/Mediator/Light.java: -------------------------------------------------------------------------------- 1 | package Mediator; 2 | 3 | //receiver 4 | public class Light { 5 | 6 | private boolean isOn = false; 7 | 8 | private String location = ""; 9 | 10 | public Light() { 11 | 12 | } 13 | 14 | public Light(String location) { 15 | this.location = location; 16 | } 17 | 18 | public boolean isOn() { 19 | return isOn; 20 | } 21 | 22 | public void toggle() { 23 | if(isOn) { 24 | off(); 25 | isOn = false; 26 | } 27 | else { 28 | on(); 29 | isOn = true; 30 | } 31 | } 32 | 33 | public void on() { 34 | System.out.println(location + " Light switched on."); 35 | } 36 | 37 | public void off() { 38 | System.out.println(location + " Light switched off."); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Behavioral/Mediator/Mediator/Mediator.java: -------------------------------------------------------------------------------- 1 | package Mediator; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class Mediator { 7 | 8 | private List lights = new ArrayList<>(); 9 | 10 | public void registerLight(Light light) { 11 | lights.add(light); 12 | } 13 | 14 | public void turnOnAllLights() { 15 | for (Light light : lights) { 16 | if(!light.isOn()) { 17 | light.toggle(); 18 | } 19 | } 20 | } 21 | 22 | public void turnOffAllLights() { 23 | for (Light light : lights) { 24 | if(light.isOn()) { 25 | light.toggle(); 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Behavioral/Mediator/Mediator/MediatorDemo.java: -------------------------------------------------------------------------------- 1 | package Mediator; 2 | 3 | public class MediatorDemo { 4 | 5 | public static void main(String[] args) { 6 | Mediator mediator = new Mediator(); 7 | 8 | Light bedroomLight = new Light("Bedroom"); 9 | Light kitchenLight = new Light("Kitchen"); 10 | 11 | mediator.registerLight(bedroomLight); 12 | mediator.registerLight(kitchenLight); 13 | 14 | Command turnOnAllLightsCommand = new TurnOnAllLightsCommand(mediator); 15 | 16 | turnOnAllLightsCommand.execute(); 17 | 18 | Command turnOffAllLightsCommand = new TurnOffAllLightsCommand(mediator); 19 | 20 | turnOffAllLightsCommand.execute(); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /Behavioral/Mediator/Mediator/MediatorEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Mediator; 2 | 3 | import java.util.Timer; 4 | import java.util.TimerTask; 5 | 6 | public class MediatorEverydayDemo { 7 | 8 | //private Toolkit toolkit; 9 | private Timer timer; 10 | 11 | public MediatorEverydayDemo(int seconds) { 12 | //toolkit = Toolkit.getDefaultToolkit(); 13 | timer = new Timer(); 14 | timer.schedule(new RemindTask(), seconds * 1000); 15 | timer.schedule(new RemindTaskWithoutBeep(), seconds * 2 * 1000); 16 | } 17 | 18 | class RemindTask extends TimerTask { 19 | public void run() { 20 | System.out.println("Time's up!"); 21 | //toolkit.beep(); 22 | } 23 | } 24 | 25 | class RemindTaskWithoutBeep extends TimerTask { 26 | public void run() { 27 | System.out.println("Now Time's really up!"); 28 | timer.cancel(); 29 | } 30 | } 31 | 32 | public static void main(String args[]) { 33 | System.out.println("About to schedule task."); 34 | new MediatorEverydayDemo(3); 35 | System.out.println("Task scheduled."); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Behavioral/Mediator/Mediator/TurnOffAllLightsCommand.java: -------------------------------------------------------------------------------- 1 | package Mediator; 2 | 3 | //concrete Command 4 | public class TurnOffAllLightsCommand implements Command { 5 | 6 | private Mediator med; 7 | 8 | public TurnOffAllLightsCommand(Mediator med) { 9 | this.med = med; 10 | } 11 | 12 | @Override 13 | public void execute() { 14 | med.turnOffAllLights(); 15 | } 16 | } -------------------------------------------------------------------------------- /Behavioral/Mediator/Mediator/TurnOnAllLightsCommand.java: -------------------------------------------------------------------------------- 1 | package Mediator; 2 | 3 | //concrete Command 4 | public class TurnOnAllLightsCommand implements Command { 5 | 6 | private Mediator med; 7 | 8 | public TurnOnAllLightsCommand(Mediator med) { 9 | this.med = med; 10 | } 11 | 12 | @Override 13 | public void execute() { 14 | med.turnOnAllLights(); 15 | } 16 | } -------------------------------------------------------------------------------- /Behavioral/Mediator/mediator.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Behavioral/Mediator/mediator.pdf -------------------------------------------------------------------------------- /Behavioral/Memento/Memento/Caretaker.java: -------------------------------------------------------------------------------- 1 | package Memento; 2 | 3 | import java.util.Stack; 4 | 5 | //caretaker 6 | public class Caretaker { 7 | 8 | private Stack employeeHistory = new Stack<>(); 9 | 10 | public void save(Employee emp) { 11 | employeeHistory.push(emp.save()); 12 | } 13 | 14 | public void revert(Employee emp) { 15 | emp.revert(employeeHistory.pop()); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Behavioral/Memento/Memento/Employee.java: -------------------------------------------------------------------------------- 1 | package Memento; 2 | 3 | //originator 4 | public class Employee { 5 | 6 | private String name; 7 | private String address; 8 | private String phone; 9 | 10 | public String getAddress() { 11 | return address; 12 | } 13 | 14 | public String getName() { 15 | return name; 16 | } 17 | 18 | public String getPhone() { 19 | return phone; 20 | } 21 | 22 | public void setAddress(String address) { 23 | this.address = address; 24 | } 25 | 26 | public void setName(String name) { 27 | this.name = name; 28 | } 29 | 30 | public void setPhone(String phone) { 31 | this.phone = phone; 32 | } 33 | 34 | public String toString() { 35 | return name + " : " + phone; 36 | } 37 | 38 | public EmployeeMemento save() { 39 | return new EmployeeMemento(name, phone); 40 | } 41 | 42 | public void revert(EmployeeMemento emp) { 43 | this.name = emp.getName(); 44 | this.phone = emp.getPhone(); 45 | } 46 | } -------------------------------------------------------------------------------- /Behavioral/Memento/Memento/EmployeeMemento.java: -------------------------------------------------------------------------------- 1 | package Memento; 2 | 3 | //Memento 4 | public class EmployeeMemento { 5 | 6 | private String name; 7 | private String phone; 8 | 9 | public EmployeeMemento(String name, String phone) { 10 | this.name = name; 11 | this.phone = phone; 12 | } 13 | 14 | public String getName() { 15 | return name; 16 | } 17 | 18 | public String getPhone() { 19 | return phone; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Behavioral/Memento/Memento/MementoDemo.java: -------------------------------------------------------------------------------- 1 | package Memento; 2 | 3 | public class MementoDemo { 4 | 5 | public static void main (String args[]) { 6 | 7 | Caretaker caretaker = new Caretaker(); 8 | 9 | Employee emp = new Employee(); 10 | 11 | emp.setName("John Wick"); 12 | emp.setAddress("111 Main Street"); 13 | emp.setPhone("888-555-1212"); 14 | 15 | System.out.println("Employee before save: " + emp); 16 | 17 | caretaker.save(emp); 18 | 19 | emp.setPhone("444-555-6666"); 20 | 21 | caretaker.save(emp); 22 | 23 | System.out.println("Employee after changed phone number save: " + emp); 24 | 25 | emp.setPhone("333-999-6666"); // <--- we haven't called save! 26 | 27 | caretaker.revert(emp); 28 | 29 | System.out.println("Reverts to last save point: " + emp); 30 | 31 | caretaker.revert(emp); 32 | 33 | System.out.println("Reverted to original: " + emp); 34 | 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Behavioral/Memento/Memento/MementoEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Memento; 2 | 3 | import java.io.FileInputStream; 4 | import java.io.FileOutputStream; 5 | import java.io.IOException; 6 | import java.io.ObjectInputStream; 7 | import java.io.ObjectOutputStream; 8 | 9 | public class MementoEverydayDemo { 10 | 11 | private static Employee deserialize() { 12 | Employee emp = null; 13 | try { 14 | FileInputStream fileIn = new FileInputStream("/tmp/employee.ser"); 15 | ObjectInputStream in = new ObjectInputStream(fileIn); 16 | emp = (Employee) in.readObject(); 17 | in.close(); 18 | fileIn.close(); 19 | } catch (ClassNotFoundException | IOException e) { 20 | e.printStackTrace(); 21 | } 22 | 23 | return emp; 24 | } 25 | 26 | private static void serialize(Employee emp) { 27 | 28 | try { 29 | FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser"); 30 | ObjectOutputStream out = new ObjectOutputStream(fileOut); 31 | out.writeObject(emp); 32 | out.close(); 33 | fileOut.close(); 34 | } catch (IOException i) { 35 | i.printStackTrace(); 36 | } 37 | } 38 | 39 | public static void main(String args[]) { 40 | Employee emp = new Employee(); 41 | emp.setName("Bryan Hansen"); 42 | emp.setAddress("111 E Code Street"); 43 | emp.setPhone("888-555-1212"); 44 | 45 | serialize(emp); 46 | 47 | Employee newEmp = deserialize(); 48 | 49 | System.out.println(newEmp.getName()); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Behavioral/Memento/memento.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Behavioral/Memento/memento.pdf -------------------------------------------------------------------------------- /Behavioral/Observer/Observer/MessageStream.java: -------------------------------------------------------------------------------- 1 | package Observer; 2 | 3 | import java.util.ArrayDeque; 4 | import java.util.Deque; 5 | 6 | public class MessageStream extends Subject { 7 | 8 | private Deque messageHistory = new ArrayDeque<>(); 9 | 10 | @Override 11 | void setState(String message) { 12 | messageHistory.add(message); 13 | this.notifyObservers(); 14 | } 15 | 16 | @Override 17 | String getState() { 18 | return messageHistory.getLast(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Behavioral/Observer/Observer/Observer.java: -------------------------------------------------------------------------------- 1 | package Observer; 2 | 3 | public abstract class Observer { 4 | protected Subject subject; 5 | abstract void update(); 6 | } 7 | -------------------------------------------------------------------------------- /Behavioral/Observer/Observer/ObserverDemo.java: -------------------------------------------------------------------------------- 1 | package Observer; 2 | 3 | public class ObserverDemo { 4 | 5 | public static void main(String args[]) { 6 | Subject subject = new MessageStream(); 7 | 8 | PhoneClient phoneClient = new PhoneClient(subject); 9 | TabletClient tabletClient = new TabletClient(subject); 10 | 11 | phoneClient.addMessage("Here is a new message!"); 12 | tabletClient.addMessage("Another new message!"); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Behavioral/Observer/Observer/ObserverEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Observer; 2 | 3 | import java.util.Observable; 4 | import java.util.Observer; 5 | 6 | public class ObserverEverydayDemo { 7 | 8 | public static void main(String args[]) { 9 | TwitterStream messageStream = new TwitterStream(); 10 | 11 | Client client1 = new Client("Bryan"); 12 | 13 | Client client2 = new Client("Mark"); 14 | 15 | messageStream.addObserver(client1); 16 | messageStream.addObserver(client2); 17 | 18 | messageStream.someoneTweeted(); 19 | } 20 | } 21 | 22 | // concrete subject 23 | class TwitterStream extends Observable { 24 | 25 | public void someoneTweeted() { 26 | setChanged(); 27 | notifyObservers(); 28 | } 29 | } 30 | 31 | //concrete Observer 32 | class Client implements Observer { 33 | private String name; 34 | 35 | Client(String name) { 36 | this.name = name; 37 | } 38 | 39 | @Override 40 | public void update(Observable o, Object arg) { 41 | System.out.println("Update " + name + "'s stream, someone tweeted something."); 42 | } 43 | } -------------------------------------------------------------------------------- /Behavioral/Observer/Observer/PhoneClient.java: -------------------------------------------------------------------------------- 1 | package Observer; 2 | 3 | public class PhoneClient extends Observer { 4 | 5 | public PhoneClient (Subject subject) { 6 | this.subject = subject; 7 | subject.attach(this); 8 | } 9 | 10 | public void addMessage(String message) { 11 | subject.setState(message + " - sent from phone"); 12 | } 13 | 14 | @Override 15 | void update() { 16 | System.out.println("Phone Stream: " + subject.getState()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Behavioral/Observer/Observer/Subject.java: -------------------------------------------------------------------------------- 1 | package Observer; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public abstract class Subject { 7 | 8 | private List observers = new ArrayList<>(); 9 | 10 | abstract void setState(String state); 11 | abstract String getState(); 12 | 13 | public void attach(Observer observer) { 14 | observers.add(observer); 15 | } 16 | 17 | public void detach(Observer observer) { 18 | observers.remove(observer); 19 | } 20 | 21 | public void notifyObservers() { 22 | for (Observer observer : observers) { 23 | observer.update(); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Behavioral/Observer/Observer/TabletClient.java: -------------------------------------------------------------------------------- 1 | package Observer; 2 | 3 | public class TabletClient extends Observer { 4 | 5 | public TabletClient (Subject subject) { 6 | this.subject = subject; 7 | subject.attach(this); 8 | } 9 | 10 | public void addMessage(String message) { 11 | subject.setState(message + " - sent from tablet"); 12 | } 13 | 14 | @Override 15 | void update() { 16 | System.out.println("Tablet Stream: " + subject.getState()); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /Behavioral/Observer/observer.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Behavioral/Observer/observer.pdf -------------------------------------------------------------------------------- /Behavioral/State/State/Fan.java: -------------------------------------------------------------------------------- 1 | package State; 2 | 3 | public class Fan { 4 | 5 | State fanOffState; 6 | State fanLowState; 7 | State fanMedState; 8 | State fanHighState; 9 | 10 | State state; 11 | 12 | public Fan() { 13 | fanOffState = new FanOffState(this); 14 | fanLowState = new FanLowState(this); 15 | fanMedState = new FanMedState(this); 16 | fanHighState = new FanHighState(this); 17 | 18 | state = fanOffState; 19 | } 20 | 21 | public void pullChain() { 22 | state.handleRequest(); 23 | } 24 | 25 | public String toString() { 26 | return state.toString(); 27 | } 28 | 29 | public State getFanOffState() { 30 | return fanOffState; 31 | } 32 | 33 | public State getFanLowState() { 34 | return fanLowState; 35 | } 36 | 37 | public State getFanMedState() { 38 | return fanMedState; 39 | } 40 | 41 | public State getFanHighState() { 42 | return fanHighState; 43 | } 44 | 45 | public void setState(State state) { 46 | this.state = state; 47 | } 48 | } 49 | 50 | 51 | -------------------------------------------------------------------------------- /Behavioral/State/State/FanHighState.java: -------------------------------------------------------------------------------- 1 | package State; 2 | 3 | public class FanHighState extends State { 4 | 5 | private Fan fan; 6 | 7 | public FanHighState(Fan fan) { 8 | this.fan = fan; 9 | } 10 | 11 | @Override 12 | public void handleRequest() { 13 | System.out.println("Turning fan off..."); 14 | fan.setState(fan.getFanOffState()); 15 | } 16 | 17 | public String toString() { 18 | return "Fan is on high."; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Behavioral/State/State/FanLowState.java: -------------------------------------------------------------------------------- 1 | package State; 2 | 3 | public class FanLowState extends State { 4 | 5 | private Fan fan; 6 | 7 | public FanLowState(Fan fan) { 8 | this.fan = fan; 9 | } 10 | 11 | @Override 12 | public void handleRequest() { 13 | System.out.println("Turning fan on to med."); 14 | fan.setState(fan.getFanMedState()); 15 | } 16 | 17 | public String toString() { 18 | return "Fan is low."; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Behavioral/State/State/FanMedState.java: -------------------------------------------------------------------------------- 1 | package State; 2 | 3 | public class FanMedState extends State { 4 | 5 | private Fan fan; 6 | 7 | public FanMedState(Fan fan) { 8 | this.fan = fan; 9 | } 10 | 11 | @Override 12 | public void handleRequest() { 13 | System.out.println("Turning fan on to high..."); 14 | fan.setState(fan.getFanHighState()); 15 | } 16 | 17 | public String toString() { 18 | return "Fan is on med."; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Behavioral/State/State/FanOffState.java: -------------------------------------------------------------------------------- 1 | package State; 2 | 3 | public class FanOffState extends State { 4 | 5 | private Fan fan; 6 | 7 | public FanOffState(Fan fan) { 8 | this.fan = fan; 9 | } 10 | 11 | @Override 12 | public void handleRequest() { 13 | System.out.println("Turning fan on to low."); 14 | fan.setState(fan.getFanLowState()); 15 | } 16 | 17 | public String toString() { 18 | return "Fan is off."; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Behavioral/State/State/State.java: -------------------------------------------------------------------------------- 1 | package State; 2 | 3 | public abstract class State { 4 | 5 | public void handleRequest() { 6 | System.out.println("Shouldn't be able to get here."); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Behavioral/State/State/StateDemo.java: -------------------------------------------------------------------------------- 1 | package State; 2 | 3 | public class StateDemo { 4 | 5 | public static void main(String[] args) { 6 | Fan fan = new Fan(); 7 | 8 | System.out.println(fan); 9 | 10 | fan.pullChain(); 11 | 12 | System.out.println(fan); 13 | 14 | fan.pullChain(); 15 | 16 | System.out.println(fan); 17 | 18 | fan.pullChain(); 19 | 20 | System.out.println(fan); 21 | 22 | fan.pullChain(); 23 | 24 | System.out.println(fan); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Behavioral/State/state.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Behavioral/State/state.pdf -------------------------------------------------------------------------------- /Behavioral/Strategy/Strategy/AmexStrategy.java: -------------------------------------------------------------------------------- 1 | package Strategy; 2 | 3 | public class AmexStrategy extends ValidationStrategy { 4 | 5 | @Override 6 | public boolean isValid(CreditCard creditCard) { 7 | boolean isValid = true; 8 | 9 | isValid = creditCard.getNumber().startsWith("37") || 10 | creditCard.getNumber().startsWith("34"); 11 | 12 | if(isValid) { 13 | isValid = creditCard.getNumber().length() == 15; 14 | } 15 | 16 | if(isValid) { 17 | isValid = passesLuhn(creditCard.getNumber()); 18 | } 19 | 20 | return isValid; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /Behavioral/Strategy/Strategy/CreditCard.java: -------------------------------------------------------------------------------- 1 | package Strategy; 2 | 3 | public class CreditCard { 4 | 5 | private String number; 6 | private String date; 7 | private String cvv; 8 | private ValidationStrategy strategy; 9 | 10 | public CreditCard(ValidationStrategy strategy) { 11 | this.strategy = strategy; 12 | } 13 | 14 | public boolean isValid() { 15 | return strategy.isValid(this); 16 | } 17 | 18 | public String getNumber() { 19 | return number; 20 | } 21 | 22 | public void setNumber(String number) { 23 | this.number = number; 24 | } 25 | 26 | public String getDate() { 27 | return date; 28 | } 29 | 30 | public void setDate(String date) { 31 | this.date = date; 32 | } 33 | 34 | public String getCvv() { 35 | return cvv; 36 | } 37 | 38 | public void setCvv(String cvv) { 39 | this.cvv = cvv; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Behavioral/Strategy/Strategy/Person.java: -------------------------------------------------------------------------------- 1 | package Strategy; 2 | 3 | public class Person { 4 | 5 | private int age; 6 | private String name; 7 | private String phoneNumber; 8 | 9 | public Person() { 10 | 11 | } 12 | 13 | public Person(String name, String phoneNumber, int age) { 14 | this.name = name; 15 | this.phoneNumber = phoneNumber; 16 | this.age = age; 17 | } 18 | 19 | public int getAge() { 20 | return age; 21 | } 22 | 23 | public String getName() { 24 | return name; 25 | } 26 | 27 | public String getPhoneNumber() { 28 | return phoneNumber; 29 | } 30 | 31 | public void setAge(int age) { 32 | this.age = age; 33 | } 34 | 35 | public void setName(String name) { 36 | this.name = name; 37 | } 38 | 39 | public void setPhoneNumber(String phoneNumber) { 40 | this.phoneNumber = phoneNumber; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /Behavioral/Strategy/Strategy/StrategyDemo.java: -------------------------------------------------------------------------------- 1 | package Strategy; 2 | 3 | public class StrategyDemo { 4 | 5 | public static void main(String args[]) { 6 | CreditCard amexCard = new CreditCard(new AmexStrategy()); 7 | 8 | amexCard.setNumber("379185883464283"); 9 | amexCard.setDate("04/2020"); 10 | amexCard.setCvv("123"); 11 | 12 | System.out.println("Is Amex valid: " + amexCard.isValid()); 13 | 14 | CreditCard amexCard2 = new CreditCard(new AmexStrategy()); 15 | 16 | amexCard2.setNumber("379185883464282"); 17 | amexCard2.setDate("04/2017"); 18 | amexCard2.setCvv("234"); 19 | 20 | System.out.println("Is Amex valid: " + amexCard2.isValid()); 21 | 22 | CreditCard visaCard = new CreditCard(new VisaStrategy()); 23 | 24 | visaCard.setNumber("4539589763663402"); 25 | visaCard.setDate("05/2018"); 26 | visaCard.setCvv("324"); 27 | 28 | System.out.println("Is Visa valid: " + visaCard.isValid()); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Behavioral/Strategy/Strategy/StrategyEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Strategy; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.Comparator; 6 | import java.util.List; 7 | 8 | public class StrategyEverydayDemo { 9 | 10 | private static void printContents(List people) { 11 | for (Person person : people) { 12 | System.out.println(person.getName()); 13 | } 14 | } 15 | 16 | public static void main(String args[]) { 17 | Person bryan = new Person("Bryan", "801-555-1212", 39); 18 | Person mark = new Person("Mark", "801-444-1234", 41); 19 | Person chris = new Person("Chris", "801-222-5151", 38); 20 | 21 | List people = new ArrayList(); 22 | people.add(bryan); 23 | people.add(mark); 24 | people.add(chris); 25 | 26 | System.out.println("Not sorted"); 27 | printContents(people); 28 | 29 | Collections.sort(people, new Comparator() { 30 | @Override 31 | public int compare(Person o1, Person o2) { 32 | if(o1.getAge() > o2.getAge()) { 33 | return 1; 34 | } 35 | 36 | if(o1.getAge() < o2.getAge()) { 37 | return -1; 38 | } 39 | 40 | return 0; 41 | } 42 | }); 43 | 44 | System.out.println("\nSorted by age"); 45 | printContents(people); 46 | 47 | Collections.sort(people, new Comparator() { 48 | @Override 49 | public int compare(Person o1, Person o2) { 50 | return o1.getName().compareTo(o2.getName()); 51 | } 52 | }); 53 | 54 | System.out.println("\nSorted by name"); 55 | printContents(people); 56 | 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Behavioral/Strategy/Strategy/ValidationStrategy.java: -------------------------------------------------------------------------------- 1 | package Strategy; 2 | 3 | public abstract class ValidationStrategy { 4 | 5 | public abstract boolean isValid(CreditCard creditCard); 6 | 7 | protected boolean passesLuhn(String ccNumber) { 8 | int sum = 0; 9 | boolean alternate = false; 10 | for (int i = ccNumber.length() - 1; i >= 0; i--) { 11 | int n = Integer.parseInt(ccNumber.substring(i, i + 1)); 12 | if (alternate) { 13 | n *= 2; 14 | if (n > 9) { 15 | n = (n % 10) + 1; 16 | } 17 | } 18 | sum += n; 19 | alternate = !alternate; 20 | } 21 | return (sum % 10 == 0); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Behavioral/Strategy/Strategy/VisaStrategy.java: -------------------------------------------------------------------------------- 1 | package Strategy; 2 | 3 | public class VisaStrategy extends ValidationStrategy { 4 | 5 | @Override 6 | public boolean isValid(CreditCard creditCard) { 7 | boolean isValid = true; 8 | 9 | isValid = creditCard.getNumber().startsWith("4"); 10 | 11 | if(isValid) { 12 | isValid = creditCard.getNumber().length() == 16; 13 | } 14 | 15 | if(isValid) { 16 | isValid = passesLuhn(creditCard.getNumber()); 17 | } 18 | 19 | return isValid; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /Behavioral/Strategy/strategy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Behavioral/Strategy/strategy.pdf -------------------------------------------------------------------------------- /Behavioral/TemplateMethod/TemplateMethod/OrderTemplate.java: -------------------------------------------------------------------------------- 1 | package TemplateMethod; 2 | 3 | public abstract class OrderTemplate { 4 | 5 | public boolean isGift; 6 | public abstract void doCheckout(); 7 | public abstract void doPayment(); 8 | public abstract void doReceipt(); 9 | public abstract void doDelivery(); 10 | 11 | public final void wrapGift() { 12 | System.out.println("Gift wrapped."); 13 | } 14 | 15 | public final void processOrder() { 16 | doCheckout(); 17 | doPayment(); 18 | if(isGift) { 19 | wrapGift(); 20 | } 21 | else { 22 | doReceipt(); 23 | } 24 | 25 | doDelivery(); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /Behavioral/TemplateMethod/TemplateMethod/Person.java: -------------------------------------------------------------------------------- 1 | package TemplateMethod; 2 | 3 | public class Person implements Comparable { 4 | 5 | private int age; 6 | private String name; 7 | private String phoneNumber; 8 | 9 | public Person() { 10 | 11 | } 12 | 13 | public Person(String name, String phoneNumber, int age) { 14 | this.name = name; 15 | this.phoneNumber = phoneNumber; 16 | this.age = age; 17 | } 18 | 19 | public int getAge() { 20 | return age; 21 | } 22 | 23 | public String getName() { 24 | return name; 25 | } 26 | 27 | public String getPhoneNumber() { 28 | return phoneNumber; 29 | } 30 | 31 | public void setAge(int age) { 32 | this.age = age; 33 | } 34 | 35 | public void setName(String name) { 36 | this.name = name; 37 | } 38 | 39 | public void setPhoneNumber(String phoneNumber) { 40 | this.phoneNumber = phoneNumber; 41 | } 42 | 43 | @Override 44 | public int compareTo(Person o) { 45 | 46 | if(this.age > o.age) { 47 | return 1; 48 | } 49 | 50 | if(this.age < o.age) { 51 | return -1; 52 | } 53 | 54 | return 0; 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /Behavioral/TemplateMethod/TemplateMethod/StoreOrder.java: -------------------------------------------------------------------------------- 1 | package TemplateMethod; 2 | 3 | public class StoreOrder extends OrderTemplate { 4 | 5 | @Override 6 | public void doCheckout() { 7 | System.out.println("Ring up items from cart."); 8 | } 9 | 10 | @Override 11 | public void doPayment() { 12 | System.out.println("Process payment with Card present"); 13 | } 14 | 15 | @Override 16 | public void doDelivery() { 17 | System.out.println("Bag items at counter"); 18 | } 19 | 20 | @Override 21 | public void doReceipt() { 22 | System.out.println("Print receipt"); 23 | } 24 | } -------------------------------------------------------------------------------- /Behavioral/TemplateMethod/TemplateMethod/TemplateDemo.java: -------------------------------------------------------------------------------- 1 | package TemplateMethod; 2 | 3 | public class TemplateDemo { 4 | 5 | public static void main(String[] args) { 6 | System.out.println("Web Order:"); 7 | 8 | OrderTemplate webOrder = new WebOrder(); 9 | webOrder.processOrder(); 10 | 11 | System.out.println("\nStore Order:"); 12 | 13 | OrderTemplate storeOrder = new StoreOrder(); 14 | storeOrder.processOrder(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Behavioral/TemplateMethod/TemplateMethod/TemplateEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package TemplateMethod; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.List; 6 | 7 | public class TemplateEverydayDemo { 8 | 9 | private static void printContents(List people) { 10 | for (Person person : people) { 11 | System.out.println(person.getName()); 12 | } 13 | } 14 | 15 | public static void main(String args[]) { 16 | Person bryan = new Person("Bryan", "801-555-1212", 39); 17 | Person mark = new Person("Mark", "801-444-1234", 41); 18 | Person chris = new Person("Chris", "801-222-5151", 38); 19 | 20 | List people = new ArrayList(); 21 | people.add(bryan); 22 | people.add(mark); 23 | people.add(chris); 24 | 25 | System.out.println("Not sorted"); 26 | printContents(people); 27 | 28 | Collections.sort(people); 29 | 30 | System.out.println("\nSorted by age"); 31 | printContents(people); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Behavioral/TemplateMethod/TemplateMethod/WebOrder.java: -------------------------------------------------------------------------------- 1 | package TemplateMethod; 2 | 3 | public class WebOrder extends OrderTemplate { 4 | 5 | @Override 6 | public void doCheckout() { 7 | System.out.println("Get items from cart,"); 8 | System.out.println("Set gift preferences,"); 9 | System.out.println("Set delivery address,"); 10 | System.out.println("Set billing address."); 11 | } 12 | 13 | @Override 14 | public void doPayment() { 15 | System.out.println("Process payment without Card present"); 16 | } 17 | 18 | @Override 19 | public void doDelivery() { 20 | System.out.println("Ship the item to address"); 21 | } 22 | 23 | @Override 24 | public void doReceipt() { 25 | System.out.println("Email receipt"); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /Behavioral/TemplateMethod/template-method.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Behavioral/TemplateMethod/template-method.pdf -------------------------------------------------------------------------------- /Behavioral/Visitor/Visitor/AtvPart.java: -------------------------------------------------------------------------------- 1 | package Visitor; 2 | 3 | public interface AtvPart { 4 | public void accept(AtvPartVisitor visitor); 5 | } 6 | -------------------------------------------------------------------------------- /Behavioral/Visitor/Visitor/AtvPartVisitor.java: -------------------------------------------------------------------------------- 1 | package Visitor; 2 | 3 | public interface AtvPartVisitor { 4 | void visit(Wheel wheel); 5 | void visit(Fender fender); 6 | void visit(Oil oil); 7 | void visit(PartsOrder partsOrder); 8 | } 9 | -------------------------------------------------------------------------------- /Behavioral/Visitor/Visitor/AtvPartsDisplayVisitor.java: -------------------------------------------------------------------------------- 1 | package Visitor; 2 | 3 | public class AtvPartsDisplayVisitor implements AtvPartVisitor { 4 | 5 | @Override 6 | public void visit(Wheel wheel) { 7 | System.out.println("We have a wheel."); 8 | } 9 | 10 | @Override 11 | public void visit(Fender fender) { 12 | System.out.println("We have a fender."); 13 | 14 | } 15 | 16 | @Override 17 | public void visit(Oil oil) { 18 | System.out.println("We have oil."); 19 | 20 | } 21 | 22 | @Override 23 | public void visit(PartsOrder partsOrder) { 24 | System.out.println("We have an order."); 25 | 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /Behavioral/Visitor/Visitor/AtvPartsShippingVisitor.java: -------------------------------------------------------------------------------- 1 | package Visitor; 2 | 3 | import java.util.List; 4 | 5 | public class AtvPartsShippingVisitor implements AtvPartVisitor { 6 | 7 | double shippingAmount = 0; 8 | 9 | @Override 10 | public void visit(Wheel wheel) { 11 | System.out.println("Wheels are bulky and expensive to ship."); 12 | shippingAmount += 15; 13 | } 14 | 15 | @Override 16 | public void visit(Fender fender) { 17 | System.out.println("Fenders are light and cheap to ship."); 18 | shippingAmount += 3; 19 | } 20 | 21 | @Override 22 | public void visit(Oil oil) { 23 | System.out.println("Oil is hazardous and has a fee to ship."); 24 | shippingAmount += 9; 25 | } 26 | 27 | @Override 28 | public void visit(PartsOrder order) { 29 | System.out.println("If they bought more than 3 things we will give them a discount on shipping."); 30 | List parts = order.getParts(); 31 | if(parts.size() > 3) { 32 | shippingAmount -= 5; 33 | } 34 | System.out.println("Shipping amount is: " + shippingAmount); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Behavioral/Visitor/Visitor/Fender.java: -------------------------------------------------------------------------------- 1 | package Visitor; 2 | 3 | public class Fender implements AtvPart { 4 | @Override 5 | public void accept(AtvPartVisitor visitor) { 6 | visitor.visit(this); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Behavioral/Visitor/Visitor/Oil.java: -------------------------------------------------------------------------------- 1 | package Visitor; 2 | 3 | public class Oil implements AtvPart { 4 | @Override 5 | public void accept(AtvPartVisitor visitor) { 6 | visitor.visit(this); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Behavioral/Visitor/Visitor/PartsOrder.java: -------------------------------------------------------------------------------- 1 | package Visitor; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.List; 6 | 7 | public class PartsOrder implements AtvPart { 8 | 9 | private List parts = new ArrayList<>(); 10 | 11 | public PartsOrder() { 12 | 13 | } 14 | 15 | public void addPart(AtvPart atvPart) { 16 | parts.add(atvPart); 17 | } 18 | 19 | public List getParts() { 20 | return Collections.unmodifiableList(parts); 21 | } 22 | 23 | @Override 24 | public void accept(AtvPartVisitor visitor) { 25 | for (AtvPart atvPart : parts) { 26 | atvPart.accept(visitor); 27 | } 28 | visitor.visit(this); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Behavioral/Visitor/Visitor/VisitorBad/AtvPart.java: -------------------------------------------------------------------------------- 1 | package Visitorbad; 2 | 3 | public interface AtvPart { 4 | public double calculateShipping(); 5 | } 6 | -------------------------------------------------------------------------------- /Behavioral/Visitor/Visitor/VisitorBad/Fender.java: -------------------------------------------------------------------------------- 1 | package Visitorbad; 2 | 3 | public class Fender implements AtvPart { 4 | @Override 5 | public double calculateShipping() { 6 | return 3; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Behavioral/Visitor/Visitor/VisitorBad/Oil.java: -------------------------------------------------------------------------------- 1 | package Visitorbad; 2 | 3 | public class Oil implements AtvPart { 4 | 5 | @Override 6 | public double calculateShipping() { 7 | return 9; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Behavioral/Visitor/Visitor/VisitorBad/PartsOrder.java: -------------------------------------------------------------------------------- 1 | package Visitorbad; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.List; 6 | 7 | public class PartsOrder implements AtvPart { 8 | 9 | private List parts = new ArrayList<>(); 10 | 11 | public PartsOrder() { 12 | 13 | } 14 | 15 | public void addPart(AtvPart atvPart) { 16 | parts.add(atvPart); 17 | } 18 | 19 | public List getParts() { 20 | return Collections.unmodifiableList(parts); 21 | } 22 | 23 | public double calculateShipping() { 24 | double shippingCost = 0; 25 | for (AtvPart atvPart : parts) { 26 | shippingCost += atvPart.calculateShipping(); 27 | } 28 | return shippingCost; 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /Behavioral/Visitor/Visitor/VisitorBad/VisitorDemo.java: -------------------------------------------------------------------------------- 1 | package Visitorbad; 2 | 3 | public class VisitorDemo { 4 | 5 | public static void main(String[] args) { 6 | PartsOrder order = new PartsOrder(); 7 | order.addPart(new Wheel()); 8 | order.addPart(new Fender()); 9 | order.addPart(new Oil()); 10 | 11 | double shippingCost = order.calculateShipping(); 12 | 13 | System.out.println(shippingCost); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Behavioral/Visitor/Visitor/VisitorBad/Wheel.java: -------------------------------------------------------------------------------- 1 | package Visitorbad; 2 | 3 | public class Wheel implements AtvPart { 4 | @Override 5 | public double calculateShipping() { 6 | return 12; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Behavioral/Visitor/Visitor/VisitorDemo.java: -------------------------------------------------------------------------------- 1 | package Visitor; 2 | 3 | public class VisitorDemo { 4 | 5 | public static void main(String[] args) { 6 | PartsOrder order = new PartsOrder(); 7 | order.addPart(new Wheel()); 8 | order.addPart(new Fender()); 9 | order.addPart(new Oil()); 10 | 11 | order.accept(new AtvPartsShippingVisitor()); 12 | order.accept(new AtvPartsDisplayVisitor()); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Behavioral/Visitor/Visitor/Wheel.java: -------------------------------------------------------------------------------- 1 | package Visitor; 2 | 3 | public class Wheel implements AtvPart { 4 | @Override 5 | public void accept(AtvPartVisitor visitor) { 6 | visitor.visit(this); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Behavioral/Visitor/visitor.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Behavioral/Visitor/visitor.pdf -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/AbstractFactoryDemo.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | public class AbstractFactoryDemo { 4 | 5 | public static void main(String[] args) { 6 | 7 | CreditCardFactory abstractFactory = CreditCardFactory.getCreditCardFactory(775); 8 | 9 | CreditCard card = abstractFactory.getCreditCard(CardType.PLATINUM); 10 | 11 | System.out.println(card.getClass()); 12 | 13 | abstractFactory = CreditCardFactory.getCreditCardFactory(600); 14 | 15 | CreditCard card2 = abstractFactory.getCreditCard(CardType.GOLD); 16 | 17 | System.out.println(card2.getClass()); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/AbstractFactoryEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | import java.io.ByteArrayInputStream; 4 | 5 | import javax.xml.parsers.DocumentBuilder; 6 | import javax.xml.parsers.DocumentBuilderFactory; 7 | 8 | import org.w3c.dom.Document; 9 | 10 | public class AbstractFactoryEverydayDemo { 11 | 12 | public static void main (String args[]) throws Exception { 13 | 14 | String xml = "AAPL"; 15 | ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes()); 16 | 17 | DocumentBuilderFactory abstractFactory = DocumentBuilderFactory.newInstance(); 18 | DocumentBuilder factory = abstractFactory.newDocumentBuilder(); 19 | Document doc = factory.parse(bais); 20 | 21 | doc.getDocumentElement().normalize(); 22 | 23 | System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); 24 | 25 | System.out.println(abstractFactory.getClass()); 26 | System.out.println(factory.getClass()); 27 | 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/AmexFactory.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | public class AmexFactory extends CreditCardFactory { 4 | 5 | @Override 6 | public CreditCard getCreditCard(CardType cardType) { 7 | 8 | switch (cardType) { 9 | case GOLD: 10 | return new AmexGoldCreditCard(); 11 | 12 | case PLATINUM: 13 | return new AmexPlatinumCreditCard(); 14 | 15 | default: 16 | break; 17 | } 18 | 19 | return null; 20 | } 21 | 22 | @Override 23 | public Validator getValidator(CardType cardType) { 24 | 25 | switch (cardType) { 26 | case GOLD: 27 | 28 | return new AmexGoldValidator(); 29 | 30 | case PLATINUM: 31 | 32 | return new AmexPlatinumValidator(); 33 | 34 | } 35 | 36 | return null; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/AmexGoldCreditCard.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | public class AmexGoldCreditCard extends CreditCard { 4 | 5 | 6 | 7 | } 8 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/AmexGoldValidator.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | public class AmexGoldValidator implements Validator { 4 | 5 | @Override 6 | public boolean isValid(CreditCard creditCard) { 7 | 8 | return false; 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/AmexPlatinumCreditCard.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | public class AmexPlatinumCreditCard extends CreditCard { 4 | 5 | 6 | } 7 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/AmexPlatinumValidator.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | public class AmexPlatinumValidator implements Validator { 4 | 5 | @Override 6 | public boolean isValid(CreditCard creditCard) { 7 | 8 | return false; 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/CardType.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | public enum CardType { 4 | GOLD, PLATINUM; 5 | } 6 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/CreditCard.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | //AbstractProduct 4 | public abstract class CreditCard { 5 | 6 | protected int cardNumberLength; 7 | 8 | protected int cscNumber; 9 | 10 | public int getCardNumberLength() { 11 | return cardNumberLength; 12 | } 13 | 14 | public void setCardNumberLength(int cardNumberLength) { 15 | this.cardNumberLength = cardNumberLength; 16 | } 17 | 18 | public int getCscNumber() { 19 | return cscNumber; 20 | } 21 | 22 | public void setCscNumber(int cscNumber) { 23 | this.cscNumber = cscNumber; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/CreditCardFactory.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | //AbstractFactory 4 | public abstract class CreditCardFactory { 5 | 6 | public static CreditCardFactory getCreditCardFactory(int creditScore) { 7 | 8 | if(creditScore > 650) { 9 | return new AmexFactory(); 10 | } 11 | else { 12 | return new VisaFactory(); 13 | } 14 | } 15 | 16 | public abstract CreditCard getCreditCard(CardType cardType); 17 | 18 | public abstract Validator getValidator(CardType cardType); 19 | } 20 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/Validator.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | public interface Validator { 4 | public boolean isValid(CreditCard creditCard); 5 | } 6 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/VisaBlackCreditCard.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | public class VisaBlackCreditCard extends CreditCard { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/VisaCreditCard.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | public class VisaCreditCard extends CreditCard { 4 | 5 | 6 | 7 | } 8 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/VisaFactory.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | public class VisaFactory extends CreditCardFactory { 4 | 5 | @Override 6 | public CreditCard getCreditCard(CardType cardType) { 7 | switch (cardType) { 8 | case GOLD: 9 | 10 | return new VisaGoldCreditCard(); 11 | 12 | case PLATINUM: 13 | 14 | return new VisaBlackCreditCard(); 15 | 16 | } 17 | 18 | return null; 19 | } 20 | 21 | @Override 22 | public Validator getValidator(CardType cardType) { 23 | return new VisaValidator(); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/VisaGoldCreditCard.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | public class VisaGoldCreditCard extends CreditCard { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/AbstractFactory/VisaValidator.java: -------------------------------------------------------------------------------- 1 | package AbstractFactory; 2 | 3 | public class VisaValidator implements Validator { 4 | 5 | @Override 6 | public boolean isValid(CreditCard creditCard) { 7 | // TODO Auto-generated method stub 8 | return false; 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /Creational/AbstractFactory/abstract-factory.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Creational/AbstractFactory/abstract-factory.pdf -------------------------------------------------------------------------------- /Creational/Builder/Builder/BuilderEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Builder; 2 | 3 | public class BuilderEverydayDemo { 4 | 5 | public static void main(String args[]) { 6 | 7 | StringBuilder builder = new StringBuilder(); 8 | 9 | builder.append("This is an example "); 10 | 11 | builder.append("of the builder pattern. "); 12 | 13 | builder.append("It has methods to append "); 14 | 15 | builder.append("almost anything we want to a String. "); 16 | 17 | builder.append(42); 18 | 19 | System.out.println(builder.toString()); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /Creational/Builder/Builder/BuilderLunchOrderDemo.java: -------------------------------------------------------------------------------- 1 | package Builder; 2 | 3 | public class BuilderLunchOrderDemo { 4 | 5 | public static void main(String args[]) { 6 | 7 | LunchOrder.Builder builder = new LunchOrder.Builder(); 8 | 9 | builder.bread("Wheat").dressing("Mayo").meat("Turkey"); 10 | 11 | LunchOrder lunchOrder = builder.build(); 12 | 13 | System.out.println(lunchOrder.getBread()); 14 | System.out.println(lunchOrder.getCondiments()); 15 | System.out.println(lunchOrder.getDressing()); 16 | System.out.println(lunchOrder.getMeat()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Creational/Builder/Builder/LunchOrder.java: -------------------------------------------------------------------------------- 1 | package Builder; 2 | 3 | public class LunchOrder { 4 | 5 | public static class Builder { 6 | private String bread; 7 | private String condiments; 8 | private String dressing; 9 | private String meat; 10 | 11 | public Builder() { 12 | 13 | } 14 | 15 | public LunchOrder build() { 16 | return new LunchOrder(this); 17 | } 18 | 19 | public Builder bread(String bread) { 20 | this.bread = bread; 21 | return this; 22 | } 23 | 24 | public Builder condiments(String condiments) { 25 | this.condiments = condiments; 26 | return this; 27 | } 28 | 29 | public Builder dressing(String dressing) { 30 | this.dressing = dressing; 31 | return this; 32 | } 33 | 34 | public Builder meat(String meat) { 35 | this.meat = meat; 36 | return this; 37 | } 38 | 39 | } 40 | 41 | private final String bread; 42 | private final String condiments; 43 | private final String dressing; 44 | private final String meat; 45 | 46 | private LunchOrder(Builder builder) { 47 | this.bread = builder.bread; 48 | this.condiments = builder.condiments; 49 | this.dressing = builder.dressing; 50 | this.meat = builder.meat; 51 | } 52 | 53 | public String getBread() { 54 | return bread; 55 | } 56 | 57 | public String getCondiments() { 58 | return condiments; 59 | } 60 | 61 | public String getDressing() { 62 | return dressing; 63 | } 64 | 65 | public String getMeat() { 66 | return meat; 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /Creational/Builder/Builder/LunchOrderBean.java: -------------------------------------------------------------------------------- 1 | package Builder; 2 | 3 | public class LunchOrderBean { 4 | 5 | private String bread; 6 | private String condiments; 7 | private String dressing; 8 | private String meat; 9 | 10 | public LunchOrderBean() { 11 | 12 | } 13 | 14 | public String getBread() { 15 | return bread; 16 | } 17 | public String getCondiments() { 18 | return condiments; 19 | } 20 | public String getDressing() { 21 | return dressing; 22 | } 23 | public String getMeat() { 24 | return meat; 25 | } 26 | public void setBread(String bread) { 27 | this.bread = bread; 28 | } 29 | public void setCondiments(String condiments) { 30 | this.condiments = condiments; 31 | } 32 | public void setDressing(String dressing) { 33 | this.dressing = dressing; 34 | } 35 | public void setMeat(String meat) { 36 | this.meat = meat; 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /Creational/Builder/Builder/LunchOrderBeanDemo.java: -------------------------------------------------------------------------------- 1 | package Builder; 2 | 3 | public class LunchOrderBeanDemo { 4 | 5 | public static void main(String args[]) { 6 | 7 | LunchOrderBean lunchOrderBean = new LunchOrderBean(); 8 | 9 | // lunchOrderBean.setBread("Wheat"); 10 | // lunchOrderBean.setCondiments("Lettuce"); 11 | // lunchOrderBean.setDressing("Mustard"); 12 | // lunchOrderBean.setMeat("Ham"); 13 | 14 | System.out.println(lunchOrderBean.getBread()); 15 | System.out.println(lunchOrderBean.getCondiments()); 16 | System.out.println(lunchOrderBean.getDressing()); 17 | System.out.println(lunchOrderBean.getMeat()); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /Creational/Builder/Builder/LunchOrderTele.java: -------------------------------------------------------------------------------- 1 | package Builder; 2 | 3 | public class LunchOrderTele { 4 | 5 | private String bread; 6 | private String condiments; 7 | private String dressing; 8 | private String meat; 9 | 10 | public LunchOrderTele (String bread) { 11 | this.bread = bread; 12 | } 13 | 14 | public LunchOrderTele (String bread, String condiments) { 15 | this(bread); 16 | this.condiments = condiments; 17 | } 18 | 19 | public LunchOrderTele (String bread, String condiments, String dressing) { 20 | this(bread, condiments); 21 | this.dressing = dressing; 22 | } 23 | 24 | public LunchOrderTele (String bread, String condiments, String dressing, String meat) { 25 | this(bread, condiments, dressing); 26 | this.meat = meat; 27 | } 28 | 29 | public String getBread() { 30 | return bread; 31 | } 32 | 33 | public String getCondiments() { 34 | return condiments; 35 | } 36 | 37 | public String getDressing() { 38 | return dressing; 39 | } 40 | 41 | public String getMeat() { 42 | return meat; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Creational/Builder/Builder/LunchOrderTeleDemo.java: -------------------------------------------------------------------------------- 1 | package Builder; 2 | 3 | public class LunchOrderTeleDemo { 4 | 5 | public static void main(String args[]) { 6 | 7 | LunchOrderTele lunchOrderTele = new LunchOrderTele("Wheat", "Lettuce", "Mustard", "Ham"); 8 | 9 | // lunchOrderTele.setBread("Wheat"); 10 | // lunchOrderTele.setCondiments("Lettuce"); 11 | // lunchOrderTele.setDressing("Mustard"); 12 | // lunchOrderTele.setMeat("Ham"); 13 | 14 | System.out.println(lunchOrderTele.getBread()); 15 | System.out.println(lunchOrderTele.getCondiments()); 16 | System.out.println(lunchOrderTele.getDressing()); 17 | System.out.println(lunchOrderTele.getMeat()); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /Creational/Builder/builder.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Creational/Builder/builder.pdf -------------------------------------------------------------------------------- /Creational/FactoryMethod/FactoryMethod/AboutPage.java: -------------------------------------------------------------------------------- 1 | package FactoryMethod; 2 | 3 | public class AboutPage extends Page { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /Creational/FactoryMethod/FactoryMethod/Blog.java: -------------------------------------------------------------------------------- 1 | package FactoryMethod; 2 | 3 | public class Blog extends Website { 4 | 5 | @Override 6 | public void createWebsite() { 7 | pages.add(new PostPage()); 8 | pages.add(new AboutPage()); 9 | pages.add(new CommentPage()); 10 | pages.add(new ContactPage()); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /Creational/FactoryMethod/FactoryMethod/CartPage.java: -------------------------------------------------------------------------------- 1 | package FactoryMethod; 2 | 3 | public class CartPage extends Page { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /Creational/FactoryMethod/FactoryMethod/CommentPage.java: -------------------------------------------------------------------------------- 1 | package FactoryMethod; 2 | 3 | public class CommentPage extends Page { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /Creational/FactoryMethod/FactoryMethod/ContactPage.java: -------------------------------------------------------------------------------- 1 | package FactoryMethod; 2 | 3 | public class ContactPage extends Page { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /Creational/FactoryMethod/FactoryMethod/FactoryDemo.java: -------------------------------------------------------------------------------- 1 | package FactoryMethod; 2 | 3 | public class FactoryDemo { 4 | 5 | public static void main(String[] args) { 6 | Website site = WebsiteFactory.getWebsite(WebsiteType.BLOG); 7 | 8 | System.out.println(site.getPages()); 9 | 10 | site = WebsiteFactory.getWebsite(WebsiteType.SHOP); 11 | 12 | System.out.println(site.getPages()); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Creational/FactoryMethod/FactoryMethod/FactoryEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package FactoryMethod; 2 | 3 | import java.util.Calendar; 4 | 5 | public class FactoryEverydayDemo { 6 | 7 | public static void main(String args []) { 8 | 9 | Calendar cal = Calendar.getInstance(); 10 | //Calendar cal = Calendar.get 11 | 12 | System.out.println(cal); 13 | 14 | System.out.println(cal.get(Calendar.DAY_OF_MONTH)); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /Creational/FactoryMethod/FactoryMethod/ItemPage.java: -------------------------------------------------------------------------------- 1 | package FactoryMethod; 2 | 3 | public class ItemPage extends Page { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /Creational/FactoryMethod/FactoryMethod/Page.java: -------------------------------------------------------------------------------- 1 | package FactoryMethod; 2 | 3 | public abstract class Page { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /Creational/FactoryMethod/FactoryMethod/PostPage.java: -------------------------------------------------------------------------------- 1 | package FactoryMethod; 2 | 3 | public class PostPage extends Page { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /Creational/FactoryMethod/FactoryMethod/SearchPage.java: -------------------------------------------------------------------------------- 1 | package FactoryMethod; 2 | 3 | public class SearchPage extends Page { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /Creational/FactoryMethod/FactoryMethod/Shop.java: -------------------------------------------------------------------------------- 1 | package FactoryMethod; 2 | 3 | public class Shop extends Website { 4 | 5 | @Override 6 | public void createWebsite() { 7 | pages.add(new CartPage()); 8 | pages.add(new ItemPage()); 9 | pages.add(new SearchPage()); 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /Creational/FactoryMethod/FactoryMethod/Website.java: -------------------------------------------------------------------------------- 1 | package FactoryMethod; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public abstract class Website { 7 | 8 | protected List pages = new ArrayList<>(); 9 | 10 | public List getPages() { 11 | return pages; 12 | } 13 | 14 | public Website() { 15 | this.createWebsite(); 16 | } 17 | 18 | public abstract void createWebsite(); 19 | 20 | } 21 | -------------------------------------------------------------------------------- /Creational/FactoryMethod/FactoryMethod/WebsiteFactory.java: -------------------------------------------------------------------------------- 1 | package FactoryMethod; 2 | 3 | public class WebsiteFactory { 4 | 5 | public static Website getWebsite(WebsiteType siteType) { 6 | switch(siteType) { 7 | case BLOG : { 8 | return new Blog(); 9 | } 10 | 11 | case SHOP : { 12 | return new Shop(); 13 | } 14 | 15 | default : { 16 | return null; 17 | } 18 | } 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /Creational/FactoryMethod/FactoryMethod/WebsiteType.java: -------------------------------------------------------------------------------- 1 | package FactoryMethod; 2 | 3 | public enum WebsiteType { 4 | 5 | BLOG,SHOP; 6 | 7 | } 8 | -------------------------------------------------------------------------------- /Creational/FactoryMethod/factory.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Creational/FactoryMethod/factory.pdf -------------------------------------------------------------------------------- /Creational/Prototype/Prototype/Book.java: -------------------------------------------------------------------------------- 1 | package Prototype; 2 | 3 | public class Book extends Item { 4 | 5 | private int numberOfPages; 6 | 7 | public int getNumberOfPages() { 8 | return numberOfPages; 9 | } 10 | 11 | public void setNumberOfPages(int numberOfPages) { 12 | this.numberOfPages = numberOfPages; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Creational/Prototype/Prototype/Item.java: -------------------------------------------------------------------------------- 1 | package Prototype; 2 | 3 | public abstract class Item implements Cloneable { 4 | private String title; 5 | private double price; 6 | private String url; 7 | 8 | @Override 9 | protected Object clone() throws CloneNotSupportedException { 10 | return super.clone(); 11 | } 12 | 13 | public String getTitle() { 14 | return title; 15 | } 16 | public void setTitle(String title) { 17 | this.title = title; 18 | } 19 | public double getPrice() { 20 | return price; 21 | } 22 | public void setPrice(double price) { 23 | this.price = price; 24 | } 25 | public String getUrl() { 26 | return url; 27 | } 28 | public void setUrl(String url) { 29 | this.url = url; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /Creational/Prototype/Prototype/Movie.java: -------------------------------------------------------------------------------- 1 | package Prototype; 2 | 3 | public class Movie extends Item { 4 | 5 | private String runtime; 6 | 7 | public String getRuntime() { 8 | return runtime; 9 | } 10 | 11 | public void setRuntime(String runtime) { 12 | this.runtime = runtime; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Creational/Prototype/Prototype/PrototypeDemo.java: -------------------------------------------------------------------------------- 1 | package Prototype; 2 | 3 | public class PrototypeDemo { 4 | 5 | public static void main(String[] args) { 6 | Registry registry = new Registry(); 7 | Movie movie = (Movie) registry.createItem("Movie"); 8 | movie.setTitle("Creational Patterns in Java"); 9 | 10 | System.out.println(movie); 11 | System.out.println(movie.getRuntime()); 12 | System.out.println(movie.getTitle()); 13 | System.out.println(movie.getUrl()); 14 | 15 | Movie anotherMovie = (Movie) registry.createItem("Movie"); 16 | anotherMovie.setTitle("Gang of Four"); 17 | 18 | System.out.println(anotherMovie); 19 | System.out.println(anotherMovie.getRuntime()); 20 | System.out.println(anotherMovie.getTitle()); 21 | System.out.println(anotherMovie.getUrl()); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /Creational/Prototype/Prototype/PrototypeEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Prototype; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class PrototypeEverydayDemo { 7 | 8 | public static void main(String args[]) { 9 | 10 | String sql = "select * from movies where title = ?"; 11 | 12 | List parameters = new ArrayList<>(); 13 | 14 | parameters.add("Star wars"); 15 | 16 | Record record = new Record(); 17 | 18 | Statement firstStatement = new Statement(sql, parameters, record); 19 | 20 | System.out.println(firstStatement.getSql()); 21 | 22 | System.out.println(firstStatement.getParameters()); 23 | 24 | System.out.println(firstStatement.getRecord()); 25 | 26 | Statement secondStatement = firstStatement.clone(); 27 | 28 | System.out.println(secondStatement.getSql()); 29 | 30 | System.out.println(secondStatement.getParameters()); 31 | 32 | System.out.println(secondStatement.getRecord()); 33 | 34 | } 35 | } -------------------------------------------------------------------------------- /Creational/Prototype/Prototype/Record.java: -------------------------------------------------------------------------------- 1 | package Prototype; 2 | 3 | public class Record { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /Creational/Prototype/Prototype/Registry.java: -------------------------------------------------------------------------------- 1 | package Prototype; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | public class Registry { 7 | 8 | private Map items = new HashMap(); 9 | 10 | public Registry() { 11 | loadItems(); 12 | } 13 | 14 | public Item createItem (String type) { 15 | Item item = null; 16 | 17 | try { 18 | item = (Item)(items.get(type)).clone(); 19 | } 20 | catch (CloneNotSupportedException e) { 21 | e.printStackTrace(); 22 | } 23 | 24 | return item; 25 | } 26 | 27 | private void loadItems() { 28 | Movie movie = new Movie(); 29 | movie.setTitle("Basic Movie"); 30 | movie.setPrice(24.99); 31 | movie.setRuntime("2 hours"); 32 | items.put("Movie", movie); 33 | 34 | Book book = new Book(); 35 | book.setNumberOfPages(335); 36 | book.setPrice(19.99); 37 | book.setTitle("Basic Book"); 38 | items.put("Book", book); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Creational/Prototype/Prototype/Statement.java: -------------------------------------------------------------------------------- 1 | package Prototype; 2 | 3 | import java.util.List; 4 | 5 | public class Statement implements Cloneable { 6 | 7 | private String sql; 8 | private List parameters; 9 | private Record record; 10 | 11 | public Statement(String sql, List parameters, Record record) { 12 | this.sql = sql; 13 | this.parameters = parameters; 14 | this.record = record; 15 | } 16 | 17 | public Statement clone() { 18 | try { 19 | return (Statement) super.clone(); 20 | } catch (CloneNotSupportedException e) { 21 | e.printStackTrace(); 22 | } 23 | return null; 24 | } 25 | 26 | public List getParameters() { 27 | return parameters; 28 | } 29 | 30 | public Record getRecord() { 31 | return record; 32 | } 33 | 34 | public String getSql() { 35 | return sql; 36 | } 37 | 38 | public void setParameters(List parameters) { 39 | this.parameters = parameters; 40 | } 41 | 42 | public void setRecord(Record record) { 43 | this.record = record; 44 | } 45 | 46 | public void setSql(String sql) { 47 | this.sql = sql; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Creational/Prototype/prototype.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Creational/Prototype/prototype.pdf -------------------------------------------------------------------------------- /Creational/Singleton/Singleton/DbSingleton.java: -------------------------------------------------------------------------------- 1 | package Singleton; 2 | 3 | import java.sql.Connection; 4 | import java.sql.DriverManager; 5 | import java.sql.SQLException; 6 | 7 | public class DbSingleton { 8 | 9 | private static DbSingleton instance = null; 10 | 11 | private Connection conn = null; 12 | 13 | private DbSingleton () { 14 | try { 15 | DriverManager.registerDriver(new org.apache.derby.jdbc.EmbeddedDriver()); 16 | } catch (SQLException e) { 17 | e.printStackTrace(); 18 | } 19 | } 20 | 21 | public static DbSingleton getInstance() { 22 | if(instance == null) { 23 | synchronized(DbSingleton.class) { 24 | if (instance == null) { 25 | instance = new DbSingleton(); 26 | } 27 | } 28 | } 29 | 30 | return instance; 31 | } 32 | 33 | public Connection getConnection() { 34 | if(conn == null) { 35 | synchronized (DbSingleton.class) { 36 | if(conn == null) { 37 | try { 38 | String dbUrl = "jdbc:derby:memory:codejava/webdb;create=true"; 39 | 40 | conn = DriverManager.getConnection(dbUrl); 41 | } catch (SQLException e) { 42 | e.printStackTrace(); 43 | } 44 | } 45 | } 46 | } 47 | 48 | return conn; 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /Creational/Singleton/Singleton/DbSingletonDemo.java: -------------------------------------------------------------------------------- 1 | package Singleton; 2 | 3 | import java.sql.Connection; 4 | import java.sql.SQLException; 5 | import java.sql.Statement; 6 | 7 | public class DbSingletonDemo { 8 | 9 | public static void main (String arg []) { 10 | 11 | long timeBefore = 0; 12 | long timeAfter = 0; 13 | 14 | DbSingleton instance = DbSingleton.getInstance(); 15 | 16 | timeBefore = System.currentTimeMillis(); 17 | Connection conn = instance.getConnection(); 18 | timeAfter = System.currentTimeMillis(); 19 | 20 | System.out.println(timeAfter - timeBefore); 21 | 22 | 23 | Statement sta; 24 | try { 25 | sta = conn.createStatement(); 26 | int count = sta 27 | .executeUpdate("CREATE TABLE Address (ID INT, StreetName VARCHAR(20)," 28 | + " City VARCHAR(20))"); 29 | System.out.println("Table created."); 30 | sta.close(); 31 | 32 | } catch (SQLException e) { 33 | e.printStackTrace(); 34 | } 35 | 36 | timeBefore = System.currentTimeMillis(); 37 | conn = instance.getConnection(); 38 | timeAfter = System.currentTimeMillis(); 39 | 40 | System.out.println(timeAfter - timeBefore); 41 | 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /Creational/Singleton/Singleton/SingletonEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Singleton; 2 | 3 | public class SingletonEverydayDemo { 4 | 5 | public static void main(String args[]) { 6 | 7 | Runtime singletonRuntime = Runtime.getRuntime(); 8 | 9 | singletonRuntime.gc(); 10 | 11 | System.out.println(singletonRuntime); 12 | 13 | Runtime anotherInstance = Runtime.getRuntime(); 14 | 15 | System.out.println(anotherInstance); 16 | 17 | if(singletonRuntime == anotherInstance) { 18 | System.out.println("They are the same instance"); 19 | } 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Creational/Singleton/singleton.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Creational/Singleton/singleton.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # java-design-patterns 2 | Catalog of popular object-oriented design patterns in Java 3 | 4 | ### Creational 5 | - [x] Singleton 6 | - [x] Builder 7 | - [x] Prototype 8 | - [x] Factory Method 9 | - [x] Abstract Factory 10 | 11 | ### Structural 12 | - [x] Adapter 13 | - [x] Bridge 14 | - [x] Composite 15 | - [x] Decorator 16 | - [x] Facade 17 | - [x] Flyweight 18 | - [x] Proxy 19 | 20 | ### Behavioral 21 | - [x] Chain of Responsibility 22 | - [x] Command 23 | - [x] Interpreter 24 | - [x] Iterator 25 | - [x] Mediator 26 | - [x] Observer 27 | - [x] State 28 | - [x] Strategy 29 | - [x] Template Method 30 | - [x] Visitor 31 | 32 | ### Credits 33 | This was adapted from the spectacular [Design Patterns in Java](https://app.pluralsight.com/profile/author/bryan-hansen) series by [Bryan Hansen](https://github.com/bh5k) over on [Pluralsight](https://www.pluralsight.com/). 34 | -------------------------------------------------------------------------------- /Structural/Adapter/Adapter/AdapterDemo.java: -------------------------------------------------------------------------------- 1 | package Adapter; 2 | 3 | import java.util.List; 4 | 5 | public class AdapterDemo { 6 | 7 | public static void main(String[] args) { 8 | EmployeeClient client = new EmployeeClient(); 9 | 10 | List employees = client.getEmployeeList(); 11 | 12 | System.out.println(employees); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Structural/Adapter/Adapter/AdapterEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Adapter; 2 | 3 | import java.util.Arrays; 4 | import java.util.List; 5 | 6 | public class AdapterEverydayDemo { 7 | 8 | public static void main(String args[]) { 9 | 10 | Integer[] arrayOfInts = new Integer[] { 42, 43, 44 }; 11 | 12 | List listOfInts = Arrays.asList(arrayOfInts); 13 | 14 | System.out.println(arrayOfInts); 15 | 16 | System.out.println(listOfInts); 17 | 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Structural/Adapter/Adapter/Employee.java: -------------------------------------------------------------------------------- 1 | package Adapter; 2 | 3 | public interface Employee { 4 | 5 | public String getId(); 6 | public String getFirstName(); 7 | public String getLastName(); 8 | public String getEmail(); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /Structural/Adapter/Adapter/EmployeeAdapterCSV.java: -------------------------------------------------------------------------------- 1 | package Adapter; 2 | 3 | public class EmployeeAdapterCSV implements Employee { 4 | 5 | private EmployeeCSV instance; 6 | 7 | public EmployeeAdapterCSV(EmployeeCSV instance) { 8 | this.instance = instance; 9 | } 10 | 11 | @Override 12 | public String getId() { 13 | return instance.getId() + ""; 14 | } 15 | 16 | @Override 17 | public String getFirstName() { 18 | return instance.getFirstname(); 19 | } 20 | 21 | @Override 22 | public String getLastName() { 23 | return instance.getLastname(); 24 | } 25 | 26 | @Override 27 | public String getEmail() { 28 | return instance.getEmailAddress(); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /Structural/Adapter/Adapter/EmployeeAdapterLdap.java: -------------------------------------------------------------------------------- 1 | package Adapter; 2 | 3 | public class EmployeeAdapterLdap implements Employee { 4 | 5 | private EmployeeLdap instance; 6 | 7 | public EmployeeAdapterLdap(EmployeeLdap instance) { 8 | this.instance = instance; 9 | } 10 | 11 | @Override 12 | public String getId() { 13 | return instance.getCn(); 14 | } 15 | 16 | @Override 17 | public String getFirstName() { 18 | return instance.getGivenName(); 19 | } 20 | 21 | @Override 22 | public String getLastName() { 23 | return instance.getSurname(); 24 | } 25 | 26 | @Override 27 | public String getEmail() { 28 | return instance.getMail(); 29 | } 30 | 31 | public String toString() { 32 | return "ID: " + instance.getCn(); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /Structural/Adapter/Adapter/EmployeeCSV.java: -------------------------------------------------------------------------------- 1 | package Adapter; 2 | 3 | import java.util.StringTokenizer; 4 | 5 | public class EmployeeCSV { 6 | 7 | private int id; 8 | private String firstname; 9 | private String lastname; 10 | private String emailAddress; 11 | 12 | public EmployeeCSV(String values) { 13 | StringTokenizer tokenizer = new StringTokenizer(values, ","); 14 | if (tokenizer.hasMoreElements()) { 15 | id = Integer.parseInt(tokenizer.nextToken()); 16 | } 17 | if (tokenizer.hasMoreElements()) { 18 | firstname = tokenizer.nextToken(); 19 | } 20 | if (tokenizer.hasMoreElements()) { 21 | lastname = tokenizer.nextToken(); 22 | } 23 | if (tokenizer.hasMoreElements()) { 24 | emailAddress = tokenizer.nextToken(); 25 | } 26 | } 27 | 28 | public String getEmailAddress() { 29 | return emailAddress; 30 | } 31 | 32 | public String getFirstname() { 33 | return firstname; 34 | } 35 | 36 | public int getId() { 37 | return id; 38 | } 39 | 40 | public String getLastname() { 41 | return lastname; 42 | } 43 | 44 | public void setEmailAddress(String emailAddress) { 45 | this.emailAddress = emailAddress; 46 | } 47 | 48 | public void setFirstname(String firstname) { 49 | this.firstname = firstname; 50 | } 51 | 52 | public void setId(int id) { 53 | this.id = id; 54 | } 55 | 56 | public void setLastname(String lastname) { 57 | this.lastname = lastname; 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /Structural/Adapter/Adapter/EmployeeClient.java: -------------------------------------------------------------------------------- 1 | package Adapter; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class EmployeeClient { 7 | 8 | public List getEmployeeList() { 9 | 10 | List employees = new ArrayList<>(); 11 | 12 | Employee employeeFromDB = new EmployeeDB("1234", "John", "Wick", "john@wick.com"); 13 | 14 | employees.add(employeeFromDB); 15 | 16 | //Will not work! This is where the adapter comes into play! 17 | 18 | //Employee employeeFromLdap = new EmployeeLdap("chewie", "Solo", "Han", "han@solo.com"); 19 | 20 | EmployeeLdap employeeFromLdap = new EmployeeLdap("chewie", "Solo", "Han", "han@solo.com"); 21 | 22 | employees.add(new EmployeeAdapterLdap(employeeFromLdap)); 23 | 24 | EmployeeCSV employeeFromCSV = new EmployeeCSV("567,Sherlock,Holmes,sherlock@holmes.com"); 25 | 26 | employees.add(new EmployeeAdapterCSV(employeeFromCSV)); 27 | 28 | return employees; 29 | 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /Structural/Adapter/Adapter/EmployeeDB.java: -------------------------------------------------------------------------------- 1 | package Adapter; 2 | 3 | public class EmployeeDB implements Employee { 4 | 5 | private String id; 6 | private String firstName; 7 | private String lastName; 8 | private String email; 9 | 10 | public EmployeeDB(String id, String firstName, String lastName, String email) { 11 | this.id = id; 12 | this.firstName = firstName; 13 | this.lastName = lastName; 14 | this.email = email; 15 | } 16 | 17 | public String getId() { 18 | return id; 19 | } 20 | public void setId(String id) { 21 | this.id = id; 22 | } 23 | public String getFirstName() { 24 | return firstName; 25 | } 26 | public void setFirstName(String firstName) { 27 | this.firstName = firstName; 28 | } 29 | public String getLastName() { 30 | return lastName; 31 | } 32 | public void setLastName(String lastName) { 33 | this.lastName = lastName; 34 | } 35 | public String getEmail() { 36 | return email; 37 | } 38 | public void setEmail(String email) { 39 | this.email = email; 40 | } 41 | 42 | public String toString() { 43 | return "ID: " + id + ", First name: " + firstName + ", Last name: " + lastName + ", Email: " + email; 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /Structural/Adapter/Adapter/EmployeeLdap.java: -------------------------------------------------------------------------------- 1 | package Adapter; 2 | 3 | public class EmployeeLdap { 4 | 5 | private String cn; 6 | private String surname; 7 | private String givenName; 8 | private String mail; 9 | 10 | public EmployeeLdap(String cn, String surname, String givenName, String mail) { 11 | this.cn = cn; 12 | this.surname = surname; 13 | this.givenName = givenName; 14 | this.mail = mail; 15 | } 16 | 17 | public String getCn() { 18 | return cn; 19 | } 20 | public void setCn(String cn) { 21 | this.cn = cn; 22 | } 23 | public String getSurname() { 24 | return surname; 25 | } 26 | public void setSurname(String surname) { 27 | this.surname = surname; 28 | } 29 | public String getGivenName() { 30 | return givenName; 31 | } 32 | public void setGivenName(String givenName) { 33 | this.givenName = givenName; 34 | } 35 | public String getMail() { 36 | return mail; 37 | } 38 | public void setMail(String mail) { 39 | this.mail = mail; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Structural/Adapter/adapter.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Structural/Adapter/adapter.pdf -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/BridgeDemo.java: -------------------------------------------------------------------------------- 1 | package Bridge; 2 | 3 | public class BridgeDemo { 4 | 5 | public static void main(String[] args) { 6 | Movie movie = new Movie(); 7 | movie.setClassification("Action"); 8 | movie.setTitle("John Wick"); 9 | movie.setRuntime("2:15"); 10 | movie.setYear("2014"); 11 | 12 | Formatter printFormatter = new PrintFormatter(); 13 | Printer moviePrinter = new MoviePrinter(movie); 14 | 15 | String printedMaterial = moviePrinter.print(printFormatter); 16 | 17 | System.out.println(printedMaterial); 18 | 19 | Formatter htmlFormatter = new HtmlFormatter(); 20 | 21 | String htmlMaterial = moviePrinter.print(htmlFormatter); 22 | 23 | System.out.println(htmlMaterial); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/BridgeEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Bridge; 2 | 3 | import java.sql.Connection; 4 | import java.sql.DriverManager; 5 | import java.sql.SQLException; 6 | import java.sql.Statement; 7 | 8 | public class BridgeEverydayDemo { 9 | 10 | public static void main(String args[]) { 11 | 12 | try { 13 | //JDBC is an API 14 | DriverManager.registerDriver(new org.apache.derby.jdbc.EmbeddedDriver()); // <- Driver 15 | 16 | String dbUrl = "jdbc:derby:memory:codejava/webdb;create=true"; 17 | 18 | Connection conn = DriverManager.getConnection(dbUrl); 19 | 20 | Statement sta = conn.createStatement(); 21 | 22 | //This client is an abstraction and can work with any database that has a driver 23 | sta.executeUpdate("CREATE TABLE Address (ID INT, StreetName VARCHAR(20)," 24 | + " City VARCHAR(20))"); 25 | 26 | System.out.println("Table created"); 27 | 28 | } catch (SQLException e) { 29 | e.printStackTrace(); 30 | } 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/Detail.java: -------------------------------------------------------------------------------- 1 | package Bridge; 2 | 3 | public class Detail { 4 | private String label; 5 | private String value; 6 | 7 | public Detail(String label, String value) { 8 | this.label = label; 9 | this.value = value; 10 | } 11 | 12 | public String getLabel() { 13 | return label; 14 | } 15 | 16 | public String getValue() { 17 | return value; 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/Formatter.java: -------------------------------------------------------------------------------- 1 | package Bridge; 2 | 3 | import java.util.List; 4 | 5 | public interface Formatter { 6 | String format(String header, List details); 7 | } 8 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/HtmlFormatter.java: -------------------------------------------------------------------------------- 1 | package Bridge; 2 | 3 | import java.util.List; 4 | 5 | public class HtmlFormatter implements Formatter { 6 | 7 | @Override 8 | public String format(String header, List details) { 9 | StringBuilder builder = new StringBuilder(); 10 | builder.append(""); 11 | builder.append(""); 14 | builder.append(""); 17 | 18 | for (Detail detail : details) { 19 | builder.append(""); 24 | } 25 | builder.append("
"); 12 | builder.append("Classification"); 13 | builder.append(""); 15 | builder.append(header); 16 | builder.append("
"); 20 | builder.append(detail.getLabel()); 21 | builder.append(""); 22 | builder.append(detail.getValue()); 23 | builder.append("
"); 26 | 27 | return builder.toString(); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/Movie.java: -------------------------------------------------------------------------------- 1 | package Bridge; 2 | 3 | public class Movie { 4 | 5 | private String classification; 6 | private String runtime; 7 | private String title; 8 | private String year; 9 | 10 | public String getClassification() { 11 | return classification; 12 | } 13 | public String getRuntime() { 14 | return runtime; 15 | } 16 | 17 | public String getTitle() { 18 | return title; 19 | } 20 | 21 | public String getYear() { 22 | return year; 23 | } 24 | 25 | public void setClassification(String classification) { 26 | this.classification = classification; 27 | } 28 | 29 | public void setRuntime(String runtime) { 30 | this.runtime = runtime; 31 | } 32 | 33 | public void setTitle(String title) { 34 | this.title = title; 35 | } 36 | 37 | public void setYear(String year) { 38 | this.year = year; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/MoviePrinter.java: -------------------------------------------------------------------------------- 1 | package Bridge; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class MoviePrinter extends Printer { 7 | 8 | private Movie movie; 9 | 10 | public MoviePrinter(Movie movie) { 11 | this.movie = movie; 12 | } 13 | 14 | @Override 15 | protected List getDetails() { 16 | List details = new ArrayList<>(); 17 | 18 | details.add(new Detail("Title", movie.getTitle())); 19 | details.add(new Detail("Year", movie.getYear())); 20 | details.add(new Detail("Runtime", movie.getRuntime())); 21 | 22 | return details; 23 | } 24 | 25 | @Override 26 | protected String getHeader() { 27 | return movie.getClassification(); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/PrintFormatter.java: -------------------------------------------------------------------------------- 1 | package Bridge; 2 | 3 | import java.util.List; 4 | 5 | public class PrintFormatter implements Formatter { 6 | 7 | @Override 8 | public String format(String header, List details) { 9 | StringBuilder builder = new StringBuilder(); 10 | builder.append(header); 11 | builder.append("\n"); 12 | 13 | for (Detail detail : details) { 14 | builder.append(detail.getLabel()); 15 | builder.append(":"); 16 | builder.append(detail.getValue()); 17 | builder.append("\n"); 18 | } 19 | 20 | return builder.toString(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/Printer.java: -------------------------------------------------------------------------------- 1 | package Bridge; 2 | 3 | import java.util.List; 4 | 5 | public abstract class Printer { 6 | 7 | public String print(Formatter formatter) { 8 | return formatter.format(getHeader(), getDetails()); 9 | } 10 | 11 | abstract protected List getDetails(); 12 | 13 | abstract protected String getHeader(); 14 | } 15 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape1/BlueCircle.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape1; 2 | 3 | public class BlueCircle extends Circle { 4 | 5 | @Override 6 | public void applyColor() { 7 | System.out.println("Applying blue color"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape1/BlueSquare.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape1; 2 | 3 | public class BlueSquare extends Square { 4 | 5 | @Override 6 | public void applyColor() { 7 | System.out.println("Applying blue color"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape1/Circle.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape1; 2 | 3 | public abstract class Circle extends Shape { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape1/GreenSquare.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape1; 2 | 3 | public class GreenSquare extends Square { 4 | 5 | @Override 6 | public void applyColor() { 7 | System.out.println("Applying green color"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape1/RedCircle.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape1; 2 | 3 | public class RedCircle extends Circle { 4 | 5 | @Override 6 | public void applyColor() { 7 | System.out.println("Applying red color"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape1/RedSquare.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape1; 2 | 3 | public class RedSquare extends Square { 4 | 5 | @Override 6 | public void applyColor() { 7 | System.out.println("Applying red color"); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape1/Shape.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape1; 2 | 3 | public abstract class Shape { 4 | 5 | public Shape() { 6 | 7 | } 8 | 9 | abstract public void applyColor(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape1/Shape1BridgeDemo.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape1; 2 | 3 | public class Shape1BridgeDemo { 4 | 5 | public static void main(String args[]) { 6 | 7 | Circle circle = new BlueCircle(); 8 | 9 | Square square = new RedSquare(); 10 | 11 | Square greenSquare = new GreenSquare(); 12 | 13 | circle.applyColor(); 14 | square.applyColor(); 15 | greenSquare.applyColor(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape1/Square.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape1; 2 | 3 | public abstract class Square extends Shape { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape2/Blue.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape2; 2 | 3 | public class Blue implements Color { 4 | 5 | @Override 6 | public void applyColor() { 7 | System.out.println("Applying blue color"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape2/Circle.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape2; 2 | 3 | public class Circle extends Shape { 4 | 5 | public Circle(Color color) { 6 | super(color); 7 | } 8 | 9 | @Override 10 | public void applyColor() { 11 | color.applyColor(); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape2/Color.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape2; 2 | 3 | public interface Color { 4 | 5 | public void applyColor(); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape2/Green.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape2; 2 | 3 | public class Green implements Color { 4 | 5 | @Override 6 | public void applyColor() { 7 | System.out.println("Applying green color"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape2/Red.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape2; 2 | 3 | public class Red implements Color { 4 | 5 | @Override 6 | public void applyColor() { 7 | System.out.println("Applying red color"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape2/Shape.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape2; 2 | 3 | public abstract class Shape { 4 | 5 | protected Color color; 6 | 7 | public Shape(Color color) { 8 | this.color = color; 9 | } 10 | 11 | abstract public void applyColor(); 12 | } 13 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape2/Shape2BridgeDemo.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape2; 2 | 3 | public class Shape2BridgeDemo { 4 | 5 | public static void main(String[] args) { 6 | Color blue = new Blue(); 7 | 8 | Shape square = new Square(blue); 9 | 10 | Color red = new Red(); 11 | 12 | Shape circle = new Circle(red); 13 | 14 | Color green = new Green(); 15 | 16 | Shape greenCircle = new Circle(green); 17 | 18 | Shape greenSquare = new Square(green); 19 | 20 | square.applyColor(); 21 | circle.applyColor(); 22 | greenCircle.applyColor(); 23 | greenSquare.applyColor(); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /Structural/Bridge/Bridge/shape2/Square.java: -------------------------------------------------------------------------------- 1 | package Bridge.shape2; 2 | 3 | public class Square extends Shape { 4 | 5 | public Square(Color color) { 6 | super(color); 7 | } 8 | 9 | @Override 10 | public void applyColor() { 11 | color.applyColor(); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /Structural/Bridge/bridge.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Structural/Bridge/bridge.pdf -------------------------------------------------------------------------------- /Structural/Composite/Composite/CompositeEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Composite; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | public class CompositeEverydayDemo { 7 | 8 | public static void main(String args []) { 9 | Map personAttributes = new HashMap<>(); 10 | 11 | personAttributes.put("site_role", "person"); 12 | personAttributes.put("access_role", "limited"); 13 | 14 | Map groupAttributes = new HashMap<>(); 15 | 16 | groupAttributes.put("group_role", "claims"); 17 | 18 | Map secAttributes = new HashMap<>(); 19 | 20 | secAttributes.putAll(personAttributes); 21 | secAttributes.putAll(groupAttributes); 22 | 23 | System.out.println(secAttributes); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Structural/Composite/Composite/CompositeMenuDemo.java: -------------------------------------------------------------------------------- 1 | package Composite; 2 | 3 | 4 | public class CompositeMenuDemo { 5 | 6 | public static void main(String[] args) { 7 | 8 | Menu mainMenu = new Menu("Main", "/main"); 9 | 10 | MenuItem safetyMenuItem = new MenuItem("Safety", "/safety"); 11 | 12 | mainMenu.add(safetyMenuItem); 13 | 14 | Menu claimsSubMenu = new Menu("Claims", "/claims"); 15 | 16 | mainMenu.add(claimsSubMenu); 17 | 18 | MenuItem personalClaimsMenu = new MenuItem("Personal Claim", "/personalClaims"); 19 | 20 | claimsSubMenu.add(personalClaimsMenu); 21 | 22 | System.out.println(mainMenu.toString()); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Structural/Composite/Composite/Menu.java: -------------------------------------------------------------------------------- 1 | package Composite; 2 | 3 | import java.util.Iterator; 4 | 5 | public class Menu extends MenuComponent { 6 | 7 | public Menu(String name, String url) { 8 | this.name = name; 9 | this.url = url; 10 | } 11 | 12 | @Override 13 | public MenuComponent add(MenuComponent menuComponent) { 14 | menuComponents.add(menuComponent); 15 | return menuComponent; 16 | } 17 | 18 | @Override 19 | public MenuComponent remove(MenuComponent menuComponent) { 20 | menuComponents.remove(menuComponent); 21 | return menuComponent; 22 | } 23 | 24 | @Override 25 | public String toString() { 26 | StringBuilder builder = new StringBuilder(); //builder pattern 27 | 28 | builder.append(print(this)); 29 | 30 | Iterator itr = menuComponents.iterator(); 31 | while(itr.hasNext()) { 32 | MenuComponent menuComponent = itr.next(); 33 | builder.append(menuComponent.toString()); 34 | } 35 | 36 | return builder.toString(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Structural/Composite/Composite/MenuComponent.java: -------------------------------------------------------------------------------- 1 | package Composite; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public abstract class MenuComponent { 7 | 8 | String name; 9 | String url; 10 | List menuComponents = new ArrayList<>(); 11 | 12 | public MenuComponent add(MenuComponent menuComponent) { 13 | throw new UnsupportedOperationException("Feature not implemented at this level"); 14 | } 15 | 16 | public MenuComponent remove(MenuComponent menuComponent) { 17 | throw new UnsupportedOperationException("Feature not implemented at this level"); 18 | } 19 | 20 | public String getName() { 21 | return name; 22 | } 23 | 24 | public String getUrl() { 25 | return url; 26 | } 27 | 28 | public abstract String toString(); 29 | 30 | String print(MenuComponent menuComponent) { 31 | StringBuilder builder = new StringBuilder(name); 32 | builder.append(": "); 33 | builder.append(url); 34 | builder.append("\n"); 35 | return builder.toString(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Structural/Composite/Composite/MenuItem.java: -------------------------------------------------------------------------------- 1 | package Composite; 2 | 3 | 4 | public class MenuItem extends MenuComponent { 5 | 6 | public MenuItem(String name, String url) { 7 | this.name = name; 8 | this.url = url; 9 | } 10 | 11 | @Override 12 | public String toString() { 13 | return print(this); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Structural/Composite/composite.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Structural/Composite/composite.pdf -------------------------------------------------------------------------------- /Structural/Decorator/Decorator/DecoratorEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Decorator; 2 | 3 | import java.io.DataOutputStream; 4 | import java.io.File; 5 | import java.io.FileOutputStream; 6 | import java.io.OutputStream; 7 | 8 | public class DecoratorEverydayDemo { 9 | 10 | public static void main(String args []) throws Exception { 11 | File file = new File("./output.txt"); 12 | file.createNewFile(); 13 | 14 | OutputStream oStream = new FileOutputStream(file); 15 | 16 | DataOutputStream doStream = new DataOutputStream(oStream); 17 | doStream.writeChars("text"); 18 | 19 | doStream.close(); 20 | oStream.close(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Structural/Decorator/Decorator/DecoratorSandwichDemo.java: -------------------------------------------------------------------------------- 1 | package Decorator; 2 | 3 | public class DecoratorSandwichDemo { 4 | 5 | public static void main(String args[]) { 6 | Sandwich sandwich = new DressingDecorator(new MeatDecorator(new SimpleSandwich())); 7 | 8 | System.out.println(sandwich.make()); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Structural/Decorator/Decorator/DressingDecorator.java: -------------------------------------------------------------------------------- 1 | package Decorator; 2 | 3 | public class DressingDecorator extends SandwichDecorator { 4 | 5 | public DressingDecorator(Sandwich customSandwich) { 6 | super(customSandwich); 7 | } 8 | 9 | public String make() { 10 | return customSandwich.make() + addDressing(); 11 | } 12 | 13 | private String addDressing() { 14 | return " + mustard"; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /Structural/Decorator/Decorator/MeatDecorator.java: -------------------------------------------------------------------------------- 1 | package Decorator; 2 | 3 | public class MeatDecorator extends SandwichDecorator { 4 | 5 | public MeatDecorator(Sandwich customSandwich) { 6 | super(customSandwich); 7 | } 8 | 9 | public String make() { 10 | return customSandwich.make() + addMeat(); 11 | } 12 | 13 | private String addMeat() { 14 | return " + turkey"; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Structural/Decorator/Decorator/Sandwich.java: -------------------------------------------------------------------------------- 1 | package Decorator; 2 | 3 | public interface Sandwich { 4 | public String make(); 5 | } 6 | -------------------------------------------------------------------------------- /Structural/Decorator/Decorator/SandwichDecorator.java: -------------------------------------------------------------------------------- 1 | package Decorator; 2 | 3 | public abstract class SandwichDecorator implements Sandwich { 4 | 5 | protected Sandwich customSandwich; 6 | 7 | public SandwichDecorator(Sandwich customSandwich) { 8 | this.customSandwich = customSandwich; 9 | } 10 | 11 | public String make() { 12 | return customSandwich.make(); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Structural/Decorator/Decorator/SimpleSandwich.java: -------------------------------------------------------------------------------- 1 | package Decorator; 2 | 3 | public class SimpleSandwich implements Sandwich { 4 | 5 | @Override 6 | public String make() { 7 | return "Bread"; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Structural/Decorator/decorator.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Structural/Decorator/decorator.pdf -------------------------------------------------------------------------------- /Structural/Facade/Facade/DbSingleton.java: -------------------------------------------------------------------------------- 1 | package Facade; 2 | 3 | import java.sql.Connection; 4 | import java.sql.DriverManager; 5 | import java.sql.SQLException; 6 | 7 | public class DbSingleton { 8 | 9 | private static volatile DbSingleton instance = null; 10 | 11 | private Connection conn = null; 12 | 13 | private DbSingleton () { 14 | try { 15 | DriverManager.registerDriver(new org.apache.derby.jdbc.EmbeddedDriver()); 16 | } catch (SQLException e) { 17 | e.printStackTrace(); 18 | } 19 | } 20 | 21 | public static DbSingleton getInstance() { 22 | if(instance == null) { 23 | synchronized(DbSingleton.class) { 24 | if (instance == null) { 25 | instance = new DbSingleton(); 26 | } 27 | } 28 | } 29 | 30 | return instance; 31 | } 32 | 33 | public Connection getConnection() throws SQLException { 34 | if(conn == null || conn.isClosed()) { 35 | synchronized (DbSingleton.class) { 36 | if(conn == null || conn.isClosed()) { 37 | try { 38 | String dbUrl = "jdbc:derby:memory:codejava/webdb;create=true"; 39 | 40 | conn = DriverManager.getConnection(dbUrl); 41 | } catch (SQLException e) { 42 | e.printStackTrace(); 43 | } 44 | } 45 | } 46 | } 47 | 48 | return conn; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /Structural/Facade/Facade/FacadeEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Facade; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.InputStreamReader; 5 | import java.net.URL; 6 | 7 | public class FacadeEverydayDemo { 8 | 9 | public static void main(String args[]) throws Exception { 10 | 11 | URL url = new URL("http", "www.pluralsight.com", 80, "/author/bryan-hansen"); 12 | 13 | BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 14 | 15 | String inputLine; 16 | 17 | while ((inputLine = in.readLine()) != null) { 18 | System.out.println(inputLine); 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /Structural/Facade/Facade/FacadeJdbcDemo.java: -------------------------------------------------------------------------------- 1 | package Facade; 2 | 3 | import java.util.List; 4 | 5 | public class FacadeJdbcDemo { 6 | 7 | public static void main (String args []) { 8 | 9 | JdbcFacade jdbcFacade = new JdbcFacade(); 10 | 11 | jdbcFacade.createTable(); 12 | 13 | System.out.println("Table created."); 14 | 15 | jdbcFacade.insertIntoTable(); 16 | 17 | System.out.println("Record inserted."); 18 | 19 | List
addresses = jdbcFacade.getAddresses(); 20 | 21 | for (Address address : addresses) { 22 | System.out.println(address.getId() + " " + address.getStreetName() + " " + address.getCity()); 23 | } 24 | } 25 | } 26 | 27 | -------------------------------------------------------------------------------- /Structural/Facade/Facade/JdbcDemo.java: -------------------------------------------------------------------------------- 1 | package Facade; 2 | 3 | import java.sql.Connection; 4 | import java.sql.ResultSet; 5 | import java.sql.SQLException; 6 | import java.sql.Statement; 7 | 8 | public class JdbcDemo { 9 | 10 | public static void main (String args []) { 11 | DbSingleton instance = DbSingleton.getInstance(); 12 | 13 | try { 14 | Connection conn = instance.getConnection(); 15 | 16 | Statement sta = conn.createStatement(); 17 | int count = sta.executeUpdate("CREATE TABLE Address (ID INTEGER, StreetName " 18 | + "VARCHAR(20), City VARCHAR(20))"); 19 | 20 | System.out.println("Table created."); 21 | sta.close(); 22 | 23 | sta = conn.createStatement(); 24 | count = sta.executeUpdate("INSERT INTO Address (ID, StreetName, City) " 25 | + "values (1, '1234 Some street', 'Layton')"); 26 | System.out.println(count + " record(s) created."); 27 | sta.close(); 28 | 29 | sta = conn.createStatement(); 30 | ResultSet rs = sta.executeQuery("SELECT * FROM Address"); 31 | 32 | while(rs.next()) { 33 | System.out.println(rs.getString(1) + " " + rs.getString(2) + " " + rs.getString(3)); 34 | } 35 | 36 | } catch (SQLException e) { 37 | e.printStackTrace(); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Structural/Facade/Facade/JdbcFacade.java: -------------------------------------------------------------------------------- 1 | package Facade; 2 | 3 | import java.sql.Connection; 4 | import java.sql.ResultSet; 5 | import java.sql.Statement; 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | public class JdbcFacade { 10 | 11 | DbSingleton instance = null; 12 | 13 | public JdbcFacade() { 14 | instance = DbSingleton.getInstance(); 15 | } 16 | 17 | public int createTable() { 18 | int count = 0; 19 | try { 20 | Connection conn = instance.getConnection(); 21 | Statement sta = conn.createStatement(); 22 | count = sta.executeUpdate("CREATE TABLE Address (ID INTEGER, StreetName VARCHAR(20), City VARCHAR(20))"); 23 | sta.close(); 24 | conn.close(); 25 | } catch (Exception e) { 26 | e.printStackTrace(); 27 | } 28 | return count; 29 | } 30 | 31 | public int insertIntoTable() { 32 | int count = 0; 33 | try { 34 | Connection conn = instance.getConnection(); 35 | Statement sta = conn.createStatement(); 36 | count = sta.executeUpdate("INSERT INTO Address (ID, StreetName, City) values (1, '1234 Some street', 'Layton')"); 37 | sta.close(); 38 | conn.close(); 39 | } catch (Exception e) { 40 | e.printStackTrace(); 41 | } 42 | return count; 43 | } 44 | 45 | public List
getAddresses() { 46 | List
addresses = new ArrayList<>(); 47 | 48 | try { 49 | Connection conn = instance.getConnection(); 50 | Statement sta = conn.createStatement(); 51 | ResultSet rs = sta.executeQuery("SELECT * FROM Address"); 52 | 53 | while(rs.next()) { 54 | System.out.println(rs.getString(1) + " " + rs.getString(2) + " " + rs.getString(3)); 55 | Address address = new Address(); 56 | address.setId(rs.getString(1)); 57 | address.setStreetName(rs.getString(2)); 58 | address.setCity(rs.getString(3)); 59 | 60 | addresses.add(address); 61 | } 62 | 63 | rs.close(); 64 | sta.close(); 65 | conn.close(); 66 | } catch (Exception e) { 67 | e.printStackTrace(); 68 | } 69 | 70 | return addresses; 71 | } 72 | } 73 | 74 | class Address { 75 | private String id; 76 | private String streetName; 77 | private String city; 78 | 79 | public String getId() { 80 | return id; 81 | } 82 | public void setId(String id) { 83 | this.id = id; 84 | } 85 | public String getStreetName() { 86 | return streetName; 87 | } 88 | public void setStreetName(String streetName) { 89 | this.streetName = streetName; 90 | } 91 | public String getCity() { 92 | return city; 93 | } 94 | public void setCity(String city) { 95 | this.city = city; 96 | } 97 | 98 | 99 | 100 | } 101 | -------------------------------------------------------------------------------- /Structural/Facade/facade.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Structural/Facade/facade.pdf -------------------------------------------------------------------------------- /Structural/Flyweight/Flyweight/Catalog.java: -------------------------------------------------------------------------------- 1 | package Flyweight; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | //Catalog acts as a FactoryMethod and cache for Item flyweight objects 7 | public class Catalog { 8 | private Map items = new HashMap(); 9 | 10 | //FactoryMethod method 11 | public Item lookup(String itemName) { 12 | if (!items.containsKey(itemName)) 13 | items.put(itemName, new Item(itemName)); 14 | return items.get(itemName); 15 | } 16 | 17 | public int totalItemsMade() { 18 | return items.size(); 19 | } 20 | } -------------------------------------------------------------------------------- /Structural/Flyweight/Flyweight/FlyweightEverydayDemo.java: -------------------------------------------------------------------------------- 1 | package Flyweight; 2 | 3 | public class FlyweightEverydayDemo { 4 | 5 | public static void main(String args[]) throws Exception { 6 | 7 | Integer firstInt = Integer.valueOf(5); 8 | 9 | Integer secondInt = Integer.valueOf(5); 10 | 11 | Integer thirdInt = Integer.valueOf(10); 12 | 13 | System.out.println(System.identityHashCode(firstInt)); 14 | System.out.println(System.identityHashCode(secondInt)); 15 | System.out.println(System.identityHashCode(thirdInt)); 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Structural/Flyweight/Flyweight/FlyweightInventoryDemo.java: -------------------------------------------------------------------------------- 1 | package Flyweight; 2 | 3 | public class FlyweightInventoryDemo { 4 | 5 | public static void main(String[] args) { 6 | InventorySystem ims = new InventorySystem(); 7 | 8 | ims.takeOrder("Roomba", 221); 9 | ims.takeOrder("Bose Headphones", 361); 10 | ims.takeOrder("Samsung TV", 432); 11 | ims.takeOrder("Samsung TV", 323); 12 | ims.takeOrder("Roomba", 563); 13 | ims.takeOrder("Bose Headphones", 321); 14 | ims.takeOrder("Roomba", 234); 15 | ims.takeOrder("Samsung TV", 54); 16 | ims.takeOrder("Roomba", 34); 17 | ims.takeOrder("Bose Headphones", 365); 18 | ims.takeOrder("Samsung TV", 332); 19 | ims.takeOrder("Roomba", 456); 20 | 21 | ims.process(); 22 | 23 | System.out.println(ims.report()); 24 | 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Structural/Flyweight/Flyweight/InventorySystem.java: -------------------------------------------------------------------------------- 1 | package Flyweight; 2 | 3 | import java.util.List; 4 | import java.util.concurrent.CopyOnWriteArrayList; 5 | 6 | public class InventorySystem { 7 | 8 | private final Catalog catalog = new Catalog(); 9 | private final List orders = new CopyOnWriteArrayList(); 10 | 11 | void takeOrder(String itemName, int orderNumber) { 12 | Item item = catalog.lookup(itemName); 13 | Order order = new Order(orderNumber, item); 14 | orders.add(order); 15 | } 16 | 17 | void process() { 18 | for (Order order : orders) { 19 | order.processOrder(); 20 | orders.remove(order); 21 | } 22 | } 23 | 24 | String report() { 25 | return "\nTotal Item objects made: " 26 | + catalog.totalItemsMade(); 27 | } 28 | } -------------------------------------------------------------------------------- /Structural/Flyweight/Flyweight/Item.java: -------------------------------------------------------------------------------- 1 | package Flyweight; 2 | 3 | //Instances of Item will be the Flyweights 4 | class Item { 5 | private final String name; 6 | 7 | public Item(String name) { 8 | this.name = name; 9 | } 10 | 11 | public String toString() { 12 | return name; 13 | } 14 | } -------------------------------------------------------------------------------- /Structural/Flyweight/Flyweight/Order.java: -------------------------------------------------------------------------------- 1 | package Flyweight; 2 | 3 | public class Order { 4 | private final int orderNumber; 5 | private final Item item; 6 | 7 | Order(int orderNumber, Item item) { 8 | this.orderNumber = orderNumber; 9 | this.item = item; 10 | } 11 | 12 | void processOrder() { 13 | System.out.println("Ordering " + item + " for order number " + orderNumber); 14 | } 15 | } -------------------------------------------------------------------------------- /Structural/Flyweight/flyweight.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Structural/Flyweight/flyweight.pdf -------------------------------------------------------------------------------- /Structural/Proxy/Proxy/SecurityProxy.java: -------------------------------------------------------------------------------- 1 | package Proxy; 2 | 3 | import java.lang.reflect.InvocationHandler; 4 | import java.lang.reflect.InvocationTargetException; 5 | import java.lang.reflect.Method; 6 | 7 | public class SecurityProxy implements InvocationHandler { 8 | 9 | private Object obj; 10 | 11 | private SecurityProxy(Object obj) { 12 | this.obj = obj; 13 | } 14 | 15 | public static Object newInstance(Object obj) { 16 | return java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj 17 | .getClass().getInterfaces(), new SecurityProxy(obj)); 18 | } 19 | 20 | @Override 21 | public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { 22 | Object result; 23 | try { 24 | if(m.getName().contains("post")) { 25 | throw new IllegalAccessException("Posts are currently not allowed"); 26 | } 27 | else { 28 | result = m.invoke(obj, args); 29 | } 30 | } catch (InvocationTargetException e) { 31 | throw e.getTargetException(); 32 | } catch (Exception e) { 33 | throw new RuntimeException("unexpected invocation exception: " 34 | + e.getMessage()); 35 | } 36 | return result; 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /Structural/Proxy/Proxy/TwitterDemo.java: -------------------------------------------------------------------------------- 1 | package Proxy; 2 | 3 | public class TwitterDemo { 4 | 5 | public static void main(String[] args) { 6 | TwitterService service = (TwitterService)SecurityProxy.newInstance(new TwitterServiceImpl()); 7 | 8 | System.out.println(service.getTimeline("bh5k")); 9 | 10 | service.postToTimeline("bh5k", "Some message that shouldn't go through."); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Structural/Proxy/Proxy/TwitterExample.java: -------------------------------------------------------------------------------- 1 | package Proxy; 2 | 3 | import java.util.List; 4 | 5 | import twitter4j.Query; 6 | import twitter4j.QueryResult; 7 | import twitter4j.Status; 8 | import twitter4j.Twitter; 9 | import twitter4j.TwitterException; 10 | import twitter4j.TwitterFactory; 11 | import twitter4j.conf.ConfigurationBuilder; 12 | 13 | public class TwitterExample { 14 | 15 | private static final String TWITTER_CONSUMER_KEY = "NcoaBPbSKxkCJhbDyqzjQKVjr"; 16 | private static final String TWITTER_SECRET_KEY = "23V1G25UTDjeWZTNU3maGfeLrVigSPK6JnJHDIBNDRR5FC9cHS"; 17 | private static final String TWITTER_ACCESS_TOKEN = "15022283-LBY37j2wmYiqhtPNixqVJv0B84FZEroyxvmsjaywl"; 18 | private static final String TWITTER_ACCESS_TOKEN_SECRET = "bmclfpFMqKnmzoqztnSm41WxXalkW5K2tUdnXVxIAG1Es"; 19 | 20 | public static void main (String args[]) { 21 | 22 | ConfigurationBuilder cb = new ConfigurationBuilder(); 23 | cb.setDebugEnabled(true) 24 | .setOAuthConsumerKey(TWITTER_CONSUMER_KEY) 25 | .setOAuthConsumerSecret(TWITTER_SECRET_KEY) 26 | .setOAuthAccessToken(TWITTER_ACCESS_TOKEN) 27 | .setOAuthAccessTokenSecret(TWITTER_ACCESS_TOKEN_SECRET); 28 | TwitterFactory tf = new TwitterFactory(cb.build()); 29 | Twitter twitter = tf.getInstance(); 30 | try { 31 | Query query = new Query("bh5k"); 32 | QueryResult result; 33 | do { 34 | result = twitter.search(query); 35 | List tweets = result.getTweets(); 36 | for (Status tweet : tweets) { 37 | System.out.println("@" + tweet.getUser().getScreenName() + " - " + tweet.getText()); 38 | } 39 | } while ((query = result.nextQuery()) != null); 40 | System.exit(0); 41 | } catch (TwitterException te) { 42 | te.printStackTrace(); 43 | System.out.println("Failed to search tweets: " + te.getMessage()); 44 | System.exit(-1); 45 | } 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /Structural/Proxy/Proxy/TwitterService.java: -------------------------------------------------------------------------------- 1 | package Proxy; 2 | 3 | public interface TwitterService { 4 | public String getTimeline(String screenName); 5 | public void postToTimeline(String screenName, String message); 6 | } 7 | -------------------------------------------------------------------------------- /Structural/Proxy/Proxy/TwitterServiceImpl.java: -------------------------------------------------------------------------------- 1 | package Proxy; 2 | 3 | import java.util.List; 4 | 5 | import twitter4j.Query; 6 | import twitter4j.QueryResult; 7 | import twitter4j.Status; 8 | import twitter4j.Twitter; 9 | import twitter4j.TwitterException; 10 | import twitter4j.TwitterFactory; 11 | import twitter4j.conf.ConfigurationBuilder; 12 | 13 | //https://gist.github.com/bh5k/73a82d64e35e780150d1 14 | 15 | public class TwitterServiceImpl implements TwitterService { 16 | 17 | private static final String TWITTER_CONSUMER_KEY = "p6BBcuQ8iExdE1me7VUvDVIQY"; 18 | private static final String TWITTER_SECRET_KEY = "WYBf6Sz9CQ2MgKaPQxErWIASASf4KlHGraUoI29JJoZ6eZWaBC"; 19 | private static final String TWITTER_ACCESS_TOKEN = "15022283-85fcsL6kflLJIWJ074jQgv2C4COosDMENukPNpCF3"; 20 | private static final String TWITTER_ACCESS_TOKEN_SECRET = "j7fjGTnkqJZyldI5ZR8EYvZfIYgeBTtRC37ZpZjyDnIYG"; 21 | 22 | @Override 23 | public String getTimeline(String screenName) { 24 | 25 | ConfigurationBuilder cb = new ConfigurationBuilder(); 26 | cb.setDebugEnabled(true) 27 | .setOAuthConsumerKey(TWITTER_CONSUMER_KEY) 28 | .setOAuthConsumerSecret(TWITTER_SECRET_KEY) 29 | .setOAuthAccessToken(TWITTER_ACCESS_TOKEN) 30 | .setOAuthAccessTokenSecret(TWITTER_ACCESS_TOKEN_SECRET); 31 | TwitterFactory tf = new TwitterFactory(cb.build()); 32 | Twitter twitter = tf.getInstance(); 33 | StringBuilder builder = new StringBuilder(); 34 | try { 35 | Query query = new Query(screenName); 36 | QueryResult result; 37 | do { 38 | result = twitter.search(query); 39 | List tweets = result.getTweets(); 40 | for (Status tweet : tweets) { 41 | builder.append("@" + tweet.getUser().getScreenName() + " - " + tweet.getText()); 42 | builder.append("\n"); 43 | } 44 | } while ((query = result.nextQuery()) != null); 45 | 46 | } catch (TwitterException te) { 47 | te.printStackTrace(); 48 | System.out.println("Failed to search tweets: " + te.getMessage()); 49 | } 50 | return builder.toString(); 51 | } 52 | 53 | @Override 54 | public void postToTimeline(String screenName, String message) { 55 | //we aren't going to allow this 56 | System.out.println(message); 57 | } 58 | } -------------------------------------------------------------------------------- /Structural/Proxy/Proxy/TwitterServiceStub.java: -------------------------------------------------------------------------------- 1 | package Proxy; 2 | 3 | public class TwitterServiceStub implements TwitterService { 4 | 5 | @Override 6 | public String getTimeline(String screenName) { 7 | return "My neato timeline"; 8 | } 9 | 10 | @Override 11 | public void postToTimeline(String screenName, String message) { 12 | 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Structural/Proxy/proxy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/Structural/Proxy/proxy.pdf -------------------------------------------------------------------------------- /libs/derby.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/libs/derby.jar -------------------------------------------------------------------------------- /libs/derbyclient.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clarketm/java-design-patterns/476ce9811f2a4244800422d439d5a2925f6d34e2/libs/derbyclient.jar --------------------------------------------------------------------------------