├── .gitignore ├── README.md ├── src └── main │ └── java │ └── org │ └── abqjug │ └── javapatterns │ ├── visitor │ ├── Hay.java │ ├── Meat.java │ ├── Banana.java │ ├── Animal.java │ ├── AnimalVisitor.java │ ├── Zebra.java │ ├── Bear.java │ ├── Elephant.java │ ├── Lion.java │ ├── Monkey.java │ ├── AnimalFeederVisitor.java │ ├── AnimalNameVisitor.java │ └── VisitorDemonstration.java │ ├── proxy │ ├── virtual │ │ ├── PuzzlePiece3.java │ │ ├── PuzzlePiece1.java │ │ ├── PuzzlePiece2.java │ │ ├── PuzzlePiece3Proxy.java │ │ ├── PuzzlePiece3Impl.java │ │ └── PuzzleBuilder.java │ ├── Target.java │ ├── payment │ │ ├── Payment.java │ │ ├── Money.java │ │ ├── Authority.java │ │ ├── Check.java │ │ ├── SecuredPayment.java │ │ ├── BankAccount.java │ │ └── PaymentDemonstration.java │ ├── TargetImpl.java │ ├── ProxyDemonstration.java │ └── LoggingProxy.java │ ├── decorator │ ├── Sundae.java │ ├── VanillaIceCream.java │ ├── FudgeSundaeDecorator.java │ ├── NutsSundaeDecorator.java │ ├── CherryOnTopDecorator.java │ ├── SundaeDecorator.java │ ├── WhipcreamSundaeDecorator.java │ ├── FudgeFilterDecorator.java │ └── DecoratorDemonstration.java │ ├── observer │ ├── RSSObserver.java │ ├── RSSEntry.java │ ├── ConsoleOutObserver.java │ ├── RSSFeed.java │ ├── ObserverDemonstration.java │ └── LoggingObserver.java │ ├── adapter │ ├── FahrenheitThermometer.java │ ├── CelciusThermometer.java │ ├── AdapterDemonstration.java │ └── CelciusToFahrenheitAdapter.java │ ├── composite │ ├── ArithmeticExpression.java │ ├── Number.java │ ├── CompositeDemonstration.java │ └── Operand.java │ ├── abstractfactory │ ├── cleaner │ │ ├── RegistrationDAOFactory.java │ │ ├── Registration.java │ │ ├── DAOType.java │ │ ├── MySQLRegistrationDAOFactory.java │ │ ├── OracleRegistrationDAOFactory.java │ │ ├── RegistrationDAO.java │ │ ├── Runner.java │ │ ├── MySQLRegistrationDAO.java │ │ ├── package-info.java │ │ ├── OracleRegistrationDAO.java │ │ └── RegistrationDAOCompositeFactory.java │ └── classic │ │ ├── Registration.java │ │ ├── DAOType.java │ │ ├── RegistrationDAOFactory.java │ │ ├── Client.java │ │ ├── RegistrationDAO.java │ │ ├── MySQLRegistrationDAOFactory.java │ │ ├── OracleRegistrationDAOFactory.java │ │ ├── MySQLRegistrationDAO.java │ │ ├── RegistrationDAOAbstractFactory.java │ │ ├── OracleRegistrationDAO.java │ │ ├── Runner.java │ │ └── package-info.java │ ├── strategy │ ├── AccumulatorStrategy.java │ ├── SumAccumulator.java │ ├── ProductAccumulator.java │ ├── NumberAccumulator.java │ └── Client.java │ ├── builder │ ├── custom │ │ ├── EspressoDrinkMaker.java │ │ ├── Barista.java │ │ ├── EspressoDrink.java │ │ └── EspressoDrinkBuilder.java │ └── inguava │ │ └── UsingGuavaBuilders.java │ ├── singleton │ ├── lazy │ │ ├── WrongLazySingleton.java │ │ ├── RightLazySingleton.java │ │ ├── RightLazySingletonClient.java │ │ └── WrongLazySingletonClient.java │ └── eager │ │ ├── EagerSingleton.java │ │ └── EagerSingletonClient.java │ ├── flyweight │ ├── injvm │ │ └── Client.java │ └── custom │ │ ├── Client.java │ │ ├── StarWarsActionFigureFactory.java │ │ └── StarWarsActionFigure.java │ └── memento │ ├── immutable │ ├── Messenger.java │ ├── Client.java │ └── Message.java │ └── mutable │ ├── Messenger.java │ ├── Client.java │ └── Message.java ├── javapatterns.iml └── pom.xml /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | .idea 3 | *.iml 4 | *.ipr 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | java-patterns 2 | ============= 3 | 4 | Presentation of Design Patterns in Java -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/visitor/Hay.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.visitor; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class Hay { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/visitor/Meat.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.visitor; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class Meat { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/visitor/Banana.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.visitor; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class Banana { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/virtual/PuzzlePiece3.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy.virtual; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public interface PuzzlePiece3 { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/decorator/Sundae.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.decorator; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public interface Sundae { 7 | 8 | String describeSundae(); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/observer/RSSObserver.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.observer; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public interface RSSObserver { 7 | 8 | void update(RSSEntry entry); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/Target.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public interface Target { 7 | 8 | void callMe(); 9 | 10 | void takeSomeTime(); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/visitor/Animal.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.visitor; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public interface Animal { 7 | 8 | public void accept(AnimalVisitor visitor); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/adapter/FahrenheitThermometer.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.adapter; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public interface FahrenheitThermometer { 7 | 8 | double getTemperateInF(); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/payment/Payment.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy.payment; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public interface Payment { 7 | 8 | int withdraw(); 9 | 10 | int getAmount(); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/composite/ArithmeticExpression.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.composite; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public abstract class ArithmeticExpression { 7 | 8 | public abstract double calculate(); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/cleaner/RegistrationDAOFactory.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.cleaner; 2 | 3 | import javax.sql.DataSource; 4 | 5 | public abstract class RegistrationDAOFactory { 6 | public abstract RegistrationDAO create(); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/classic/Registration.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.classic; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/29/12 6 | * Time: 5:54 PM 7 | */ 8 | public class Registration { 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/cleaner/Registration.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.cleaner; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/29/12 6 | * Time: 5:54 PM 7 | */ 8 | public class Registration { 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/classic/DAOType.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.classic; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/29/12 6 | * Time: 10:11 PM 7 | */ 8 | public enum DAOType { 9 | MYSQL, ORACLE 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/cleaner/DAOType.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.cleaner; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/29/12 6 | * Time: 10:11 PM 7 | */ 8 | public enum DAOType { 9 | MYSQL, ORACLE 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/decorator/VanillaIceCream.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.decorator; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class VanillaIceCream implements Sundae { 7 | public String describeSundae() { 8 | return "Vanilla Ice Cream"; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/strategy/AccumulatorStrategy.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.strategy; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/30/12 6 | * Time: 12:51 PM 7 | */ 8 | public interface AccumulatorStrategy { 9 | public Integer process(Integer a, Integer b); 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/virtual/PuzzlePiece1.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy.virtual; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class PuzzlePiece1 { 7 | 8 | private PuzzlePiece2 piece2; 9 | 10 | public PuzzlePiece1(PuzzlePiece2 piece2) { 11 | this.piece2 = piece2; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/classic/RegistrationDAOFactory.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.classic; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/29/12 6 | * Time: 10:07 PM 7 | */ 8 | public interface RegistrationDAOFactory { 9 | 10 | public RegistrationDAO create(); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/virtual/PuzzlePiece2.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy.virtual; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class PuzzlePiece2 { 7 | 8 | private PuzzlePiece3 puzzlePiece3; 9 | 10 | public PuzzlePiece2(PuzzlePiece3 puzzlePiece3) { 11 | this.puzzlePiece3 = puzzlePiece3; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/virtual/PuzzlePiece3Proxy.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy.virtual; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class PuzzlePiece3Proxy implements PuzzlePiece3 { 7 | 8 | private PuzzlePiece3 poxied; 9 | 10 | public void setProxied(PuzzlePiece3 proxied) { 11 | this.poxied = proxied; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/observer/RSSEntry.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.observer; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class RSSEntry { 7 | 8 | private String value; 9 | 10 | public RSSEntry(String value) { 11 | this.value = value; 12 | } 13 | 14 | public String getValue() { 15 | return value; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/strategy/SumAccumulator.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.strategy; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/30/12 6 | * Time: 12:53 PM 7 | */ 8 | public class SumAccumulator implements AccumulatorStrategy { 9 | public Integer process(Integer a, Integer b) { 10 | return a + b; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/strategy/ProductAccumulator.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.strategy; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/30/12 6 | * Time: 12:53 PM 7 | */ 8 | public class ProductAccumulator implements AccumulatorStrategy { 9 | public Integer process(Integer a, Integer b) { 10 | return a * b; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/visitor/AnimalVisitor.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.visitor; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public interface AnimalVisitor { 7 | 8 | void visit(Lion lion); 9 | 10 | void visit(Elephant elephant); 11 | 12 | void visit(Zebra zebra); 13 | 14 | void visit(Bear bear); 15 | 16 | void visit(Monkey monkey); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/visitor/Zebra.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.visitor; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class Zebra implements Animal { 7 | 8 | public void accept(AnimalVisitor visitor) { 9 | visitor.visit(this); 10 | } 11 | 12 | public void feed(Hay hay) { 13 | System.out.println("Chomp Chomp"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/visitor/Bear.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.visitor; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class Bear implements Animal { 7 | 8 | public void accept(AnimalVisitor visitor) { 9 | visitor.visit(this); 10 | } 11 | 12 | public void feed(Meat meat) { 13 | System.out.println("Yum, I love meat"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/adapter/CelciusThermometer.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.adapter; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class CelciusThermometer { 7 | 8 | double temp; 9 | 10 | public CelciusThermometer(double temp) { 11 | this.temp = temp; 12 | } 13 | 14 | public double getTemperateInC() { 15 | return temp; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/virtual/PuzzlePiece3Impl.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy.virtual; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class PuzzlePiece3Impl implements PuzzlePiece3 { 7 | 8 | private PuzzlePiece1 puzzlePiece1; 9 | 10 | public PuzzlePiece3Impl(PuzzlePiece1 puzzlePiece1) { 11 | this.puzzlePiece1 = puzzlePiece1; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/visitor/Elephant.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.visitor; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class Elephant implements Animal { 7 | 8 | public void accept(AnimalVisitor visitor) { 9 | visitor.visit(this); 10 | } 11 | 12 | public void feed(Hay hay) { 13 | System.out.println("Yum, delicious Hay"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/visitor/Lion.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.visitor; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class Lion implements Animal { 7 | 8 | public void accept(AnimalVisitor visitor) { 9 | visitor.visit(this); 10 | } 11 | 12 | public void feed(Meat meat) { 13 | System.out.println("Yum, meat is delicious"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/builder/custom/EspressoDrinkMaker.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.builder.custom; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/29/12 6 | * Time: 10:40 PM 7 | */ 8 | public class EspressoDrinkMaker { 9 | 10 | public static EspressoDrinkBuilder addShots(int i) { 11 | return new EspressoDrinkBuilder(i); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/classic/Client.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.classic; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/29/12 6 | * Time: 10:29 PM 7 | */ 8 | public class Client { 9 | 10 | 11 | public Client(RegistrationDAOFactory factory) { 12 | RegistrationDAO registrationDAO = factory.create(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/visitor/Monkey.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.visitor; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class Monkey implements Animal { 7 | @Override 8 | public void accept(AnimalVisitor visitor) { 9 | visitor.visit(this); 10 | } 11 | 12 | public void feed(Banana banana){ 13 | System.out.println("Robert loves bananas!"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/classic/RegistrationDAO.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.classic; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/29/12 6 | * Time: 5:52 PM 7 | */ 8 | public abstract class RegistrationDAO { 9 | public abstract void persist(Registration registration); 10 | 11 | public abstract void update(Registration registration); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/decorator/FudgeSundaeDecorator.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.decorator; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class FudgeSundaeDecorator extends SundaeDecorator { 7 | public FudgeSundaeDecorator(Sundae sundae) { 8 | super(sundae); 9 | } 10 | 11 | public String describeSundae() { 12 | return "Fudge " + getDecorated().describeSundae(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/decorator/NutsSundaeDecorator.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.decorator; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class NutsSundaeDecorator extends SundaeDecorator { 7 | public NutsSundaeDecorator(Sundae sundae) { 8 | super(sundae); 9 | } 10 | 11 | public String describeSundae() { 12 | return "Nuts " + getDecorated().describeSundae(); 13 | } 14 | } 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/builder/custom/Barista.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.builder.custom; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/29/12 6 | * Time: 10:44 PM 7 | */ 8 | public class Barista { 9 | public static void main(String[] args) { 10 | EspressoDrink drink = 11 | EspressoDrinkMaker.addShots(2).addWhip().addSprinkles().addSkimMilk().build(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/decorator/CherryOnTopDecorator.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.decorator; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class CherryOnTopDecorator extends SundaeDecorator { 7 | public CherryOnTopDecorator(Sundae sundae) { 8 | super(sundae); 9 | } 10 | 11 | public String describeSundae() { 12 | return getDecorated().describeSundae() + " with a Cherry on top"; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/decorator/SundaeDecorator.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.decorator; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public abstract class SundaeDecorator implements Sundae { 7 | 8 | private Sundae decorated; 9 | 10 | public SundaeDecorator(Sundae decorated) { 11 | this.decorated = decorated; 12 | } 13 | 14 | public Sundae getDecorated() { 15 | return decorated; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/decorator/WhipcreamSundaeDecorator.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.decorator; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class WhipcreamSundaeDecorator extends SundaeDecorator { 7 | public WhipcreamSundaeDecorator(Sundae sundae) { 8 | super(sundae); 9 | } 10 | 11 | public String describeSundae() { 12 | return "Whipcream " + getDecorated().describeSundae(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/singleton/lazy/WrongLazySingleton.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.singleton.lazy; 2 | 3 | public class WrongLazySingleton { 4 | private static WrongLazySingleton instance = null; 5 | 6 | private WrongLazySingleton() { } 7 | 8 | public static WrongLazySingleton getInstance() { 9 | if (instance == null) { 10 | instance = new WrongLazySingleton(); 11 | } 12 | return instance; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/observer/ConsoleOutObserver.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.observer; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class ConsoleOutObserver implements RSSObserver { 7 | 8 | private String name; 9 | 10 | public ConsoleOutObserver(String name) { 11 | this.name = name; 12 | } 13 | 14 | public void update(RSSEntry entry) { 15 | System.out.println(name + " : " + entry.getValue()); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/classic/MySQLRegistrationDAOFactory.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.classic; 2 | 3 | import javax.sql.DataSource; 4 | 5 | /** 6 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 7 | * Date: 5/29/12 8 | * Time: 5:58 PM 9 | */ 10 | public class MySQLRegistrationDAOFactory implements RegistrationDAOFactory { 11 | 12 | public RegistrationDAO create() { 13 | return new MySQLRegistrationDAO(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/cleaner/MySQLRegistrationDAOFactory.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.cleaner; 2 | 3 | import javax.sql.DataSource; 4 | 5 | /** 6 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 7 | * Date: 5/29/12 8 | * Time: 5:58 PM 9 | */ 10 | public class MySQLRegistrationDAOFactory extends RegistrationDAOFactory { 11 | 12 | 13 | public RegistrationDAO create() { 14 | return new MySQLRegistrationDAO(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/classic/OracleRegistrationDAOFactory.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.classic; 2 | 3 | import javax.sql.DataSource; 4 | 5 | /** 6 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 7 | * Date: 5/29/12 8 | * Time: 9:53 PM 9 | */ 10 | public class OracleRegistrationDAOFactory implements RegistrationDAOFactory { 11 | 12 | public RegistrationDAO create() { 13 | return new OracleRegistrationDAO(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/cleaner/OracleRegistrationDAOFactory.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.cleaner; 2 | 3 | 4 | import javax.sql.DataSource; 5 | 6 | /** 7 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 8 | * Date: 5/29/12 9 | * Time: 9:53 PM 10 | */ 11 | public class OracleRegistrationDAOFactory extends RegistrationDAOFactory { 12 | 13 | public RegistrationDAO create() { 14 | return new OracleRegistrationDAO(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/singleton/eager/EagerSingleton.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.singleton.eager; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/30/12 6 | * Time: 12:36 PM 7 | */ 8 | public class EagerSingleton { 9 | private static EagerSingleton instance = new EagerSingleton(); 10 | 11 | private EagerSingleton() { 12 | } 13 | 14 | public static EagerSingleton getInstance() { 15 | return instance; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/classic/MySQLRegistrationDAO.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.classic; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/29/12 6 | * Time: 5:55 PM 7 | */ 8 | public class MySQLRegistrationDAO extends RegistrationDAO { 9 | @Override 10 | public void persist(Registration registration) { 11 | } 12 | 13 | @Override 14 | public void update(Registration registration) { 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/decorator/FudgeFilterDecorator.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.decorator; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class FudgeFilterDecorator extends SundaeDecorator { 7 | public FudgeFilterDecorator(Sundae cherryOnTopDecorator) { 8 | super(cherryOnTopDecorator); 9 | } 10 | 11 | @Override 12 | public String describeSundae() { 13 | return getDecorated().describeSundae().replaceAll("Fudge", "xxxxx"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/composite/Number.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.composite; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class Number extends ArithmeticExpression { 7 | 8 | private double value; 9 | 10 | public Number(double value) { 11 | this.value = value; 12 | } 13 | 14 | @Override 15 | public double calculate() { 16 | return value; 17 | } 18 | 19 | @Override 20 | public String toString() { 21 | return Double.toString(value); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/TargetImpl.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class TargetImpl implements Target { 7 | 8 | public void callMe() { 9 | System.out.println("Called"); 10 | } 11 | 12 | public void takeSomeTime() { 13 | try { 14 | Thread.sleep(1000); 15 | System.out.println("Took some time"); 16 | } catch (InterruptedException e) { 17 | e.printStackTrace(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/payment/Money.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy.payment; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class Money implements Payment { 7 | 8 | private int amount; 9 | 10 | public Money(int amount) { 11 | this.amount = amount; 12 | } 13 | 14 | public int withdraw() { 15 | int withdrawAmount = amount; 16 | amount = 0; 17 | return withdrawAmount; 18 | } 19 | 20 | public int getAmount() { 21 | return amount; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/cleaner/RegistrationDAO.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.cleaner; 2 | 3 | 4 | import javax.sql.DataSource; 5 | 6 | /** 7 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 8 | * Date: 5/29/12 9 | * Time: 5:52 PM 10 | */ 11 | public abstract class RegistrationDAO { 12 | 13 | public abstract void setDataSource(DataSource dataSource); 14 | 15 | public abstract void persist(Registration registration); 16 | 17 | public abstract void update(Registration registration); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/singleton/eager/EagerSingletonClient.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.singleton.eager; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/30/12 6 | * Time: 12:37 PM 7 | */ 8 | public class EagerSingletonClient { 9 | public static void main(String[] args) { 10 | EagerSingleton eagerSingleton = EagerSingleton.getInstance(); 11 | EagerSingleton eagerSingleton2 = EagerSingleton.getInstance(); 12 | 13 | assert eagerSingleton == eagerSingleton2; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/payment/Authority.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy.payment; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class Authority { 7 | 8 | private static final String MAGIC_WORD = "please"; 9 | private boolean saidMagicWord = false; 10 | 11 | public void authorize(String magicWord) { 12 | if (MAGIC_WORD.equals(magicWord)) { 13 | saidMagicWord = true; 14 | } 15 | } 16 | 17 | public boolean canProcessPayment() { 18 | return saidMagicWord; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/ProxyDemonstration.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class ProxyDemonstration { 7 | 8 | public static void main(String[] args) { 9 | 10 | Target target = new TargetImpl(); 11 | 12 | target.callMe(); 13 | target.takeSomeTime(); 14 | 15 | System.out.println("Added Proxy"); 16 | Target targetProxy = new LoggingProxy(target); 17 | 18 | targetProxy.callMe(); 19 | targetProxy.takeSomeTime(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/flyweight/injvm/Client.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.flyweight.injvm; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/30/12 6 | * Time: 10:19 AM 7 | */ 8 | public class Client { 9 | 10 | @SuppressWarnings("StringEquality") 11 | public static void main(String[] args) { 12 | String str = "Chewbacca"; 13 | String str2 = "Chewbacca"; 14 | assert str.equals(str2); 15 | assert str == str2; 16 | String str3 = new String("Chewbacca"); 17 | assert str3 != str2; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/singleton/lazy/RightLazySingleton.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.singleton.lazy; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/30/12 6 | * Time: 12:33 PM 7 | */ 8 | public class RightLazySingleton { 9 | private static RightLazySingleton instance = null; 10 | 11 | private RightLazySingleton() { 12 | } 13 | 14 | public static synchronized RightLazySingleton getInstance() { 15 | if (instance == null) { 16 | instance = new RightLazySingleton(); 17 | } 18 | return instance; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/adapter/AdapterDemonstration.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.adapter; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class AdapterDemonstration { 7 | 8 | public static void main(String args[]) { 9 | 10 | CelciusThermometer celciusThermometer = new CelciusThermometer(34); 11 | 12 | FahrenheitThermometer thermometer = new CelciusToFahrenheitAdapter(celciusThermometer); 13 | 14 | System.out.println( 15 | "Celcius: " + celciusThermometer.getTemperateInC() + 16 | " Fahrenheit: " + thermometer.getTemperateInF()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/payment/Check.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy.payment; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class Check implements Payment { 7 | 8 | private BankAccount bankAccount; 9 | private int amount; 10 | 11 | public Check(BankAccount bankAccount, int amount) { 12 | this.bankAccount = bankAccount; 13 | this.amount = amount; 14 | } 15 | 16 | public int withdraw() { 17 | Payment withdraw = bankAccount.withdraw(amount); 18 | return withdraw.withdraw(); 19 | } 20 | 21 | public int getAmount() { 22 | return amount; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/memento/immutable/Messenger.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.memento.immutable; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/30/12 6 | * Time: 12:00 PM 7 | */ 8 | public class Messenger { 9 | 10 | private Message currentMessage; 11 | 12 | public Messenger(Message message) { 13 | this.currentMessage = message; 14 | } 15 | 16 | public Messenger() {} 17 | 18 | public Messenger postNextMessage(Message message) { 19 | return new Messenger(message); 20 | } 21 | 22 | public Message getCurrentMessage() { 23 | return currentMessage; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/classic/RegistrationDAOAbstractFactory.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.classic; 2 | 3 | import javax.sql.DataSource; 4 | 5 | /** 6 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 7 | * Date: 5/29/12 8 | * Time: 5:56 PM 9 | */ 10 | public abstract class RegistrationDAOAbstractFactory { 11 | 12 | 13 | public static RegistrationDAOFactory createRegistrationDAO(DAOType daoType) { 14 | if (daoType == DAOType.MYSQL) { 15 | return new MySQLRegistrationDAOFactory(); 16 | } else { 17 | return new OracleRegistrationDAOFactory(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/classic/OracleRegistrationDAO.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.classic; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/29/12 6 | * Time: 5:55 PM 7 | */ 8 | public class OracleRegistrationDAO extends RegistrationDAO { 9 | @Override 10 | public void persist(Registration registration) { 11 | //To change body of implemented methods use File | Settings | File Templates. 12 | } 13 | 14 | @Override 15 | public void update(Registration registration) { 16 | //To change body of implemented methods use File | Settings | File Templates. 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/adapter/CelciusToFahrenheitAdapter.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.adapter; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class CelciusToFahrenheitAdapter implements FahrenheitThermometer { 7 | 8 | private CelciusThermometer celciusThermometer; 9 | 10 | public CelciusToFahrenheitAdapter(CelciusThermometer celciusThermometer) { 11 | this.celciusThermometer = celciusThermometer; 12 | } 13 | 14 | public double getTemperateInF() { 15 | return convertCtoF(celciusThermometer.getTemperateInC()); 16 | } 17 | 18 | private double convertCtoF(double c) { 19 | return (c * 9 / 5) + 32; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/classic/Runner.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.classic; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/29/12 6 | * Time: 10:31 PM 7 | */ 8 | public class Runner { 9 | 10 | public static void main(String[] args) { 11 | String type = System.getProperty("daoType"); 12 | DAOType daoType = null; 13 | if ("mySQL".equals(type)) { 14 | daoType = DAOType.MYSQL; 15 | } else { 16 | daoType = DAOType.ORACLE; 17 | } 18 | 19 | Client client = new Client(RegistrationDAOAbstractFactory.createRegistrationDAO(daoType)); 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/visitor/AnimalFeederVisitor.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.visitor; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class AnimalFeederVisitor implements AnimalVisitor { 7 | public void visit(Lion lion) { 8 | lion.feed(new Meat()); 9 | } 10 | 11 | public void visit(Elephant elephant) { 12 | elephant.feed(new Hay()); 13 | } 14 | 15 | public void visit(Zebra zebra) { 16 | zebra.feed(new Hay()); 17 | } 18 | 19 | public void visit(Bear bear) { 20 | bear.feed(new Meat()); 21 | } 22 | 23 | @Override 24 | public void visit(Monkey monkey) { 25 | monkey.feed(new Banana()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/flyweight/custom/Client.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.flyweight.custom; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/30/12 6 | * Time: 10:16 AM 7 | */ 8 | public class Client { 9 | public static void main(String[] args) { 10 | StarWarsActionFigureFactory factory = new StarWarsActionFigureFactory(); 11 | StarWarsActionFigure starWarsActionFigure = factory.getInstance("Han Solo"); 12 | StarWarsActionFigure starWarsActionFigure2 = factory.getInstance("Han Solo"); 13 | assert starWarsActionFigure.equals(starWarsActionFigure2); 14 | assert starWarsActionFigure == starWarsActionFigure2; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/memento/mutable/Messenger.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.memento.mutable; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/30/12 6 | * Time: 11:26 AM 7 | */ 8 | public class Messenger { 9 | private Message currentMessage; 10 | 11 | public void postNextMessage(Message message) { 12 | this.currentMessage = message; 13 | } 14 | 15 | public Message getMemento() { 16 | return currentMessage.copy(); 17 | } 18 | 19 | public void setMemento(Message message) { 20 | currentMessage = message.copy(); 21 | } 22 | 23 | public Message getCurrentMessage() { 24 | return currentMessage; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/payment/SecuredPayment.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy.payment; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class SecuredPayment implements Payment { 7 | 8 | private Authority authority; 9 | private Payment withdraw; 10 | 11 | public SecuredPayment(Authority authority, Payment withdraw) { 12 | this.authority = authority; 13 | this.withdraw = withdraw; 14 | } 15 | 16 | public int withdraw() { 17 | if (authority.canProcessPayment()) { 18 | return withdraw.withdraw(); 19 | } 20 | return 0; 21 | } 22 | 23 | public int getAmount() { 24 | return withdraw.getAmount(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/visitor/AnimalNameVisitor.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.visitor; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class AnimalNameVisitor implements AnimalVisitor { 7 | public void visit(Lion lion) { 8 | System.out.println("Lion"); 9 | } 10 | 11 | public void visit(Elephant elephant) { 12 | System.out.println("Elephant"); 13 | } 14 | 15 | public void visit(Zebra zebra) { 16 | System.out.println("Zebra"); 17 | } 18 | 19 | public void visit(Bear bear) { 20 | System.out.println("Bear"); 21 | } 22 | 23 | @Override 24 | public void visit(Monkey monkey) { 25 | System.out.println("Monkey"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/strategy/NumberAccumulator.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.strategy; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 7 | * Date: 5/30/12 8 | * Time: 12:47 PM 9 | */ 10 | public class NumberAccumulator { 11 | private AccumulatorStrategy strategy; 12 | 13 | public void setAccumulatorStrategy(AccumulatorStrategy strategy) { 14 | this.strategy = strategy; 15 | } 16 | 17 | public Integer accumulate(List integers) { 18 | if (integers.size() == 1) return integers.get(0); 19 | return strategy.process(integers.get(0), 20 | accumulate(integers.subList(1, integers.size()))); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/composite/CompositeDemonstration.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.composite; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class CompositeDemonstration { 7 | 8 | public static void main(String[] args) { 9 | 10 | // (4 + 6) * (1 / 2) 11 | ArithmeticExpression calculation = 12 | new Operand( 13 | new Operand(new Number(4), Operand.Operation.PLUS, new Number(6)), 14 | Operand.Operation.MULTIPLICATION, 15 | new Operand(new Number(1), Operand.Operation.DIVISION, new Number(2))); 16 | 17 | System.out.println(calculation.toString() + " = " + calculation.calculate()); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/builder/inguava/UsingGuavaBuilders.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.builder.inguava; 2 | 3 | import com.google.common.collect.ImmutableList; 4 | import com.google.common.collect.Lists; 5 | 6 | import javax.swing.*; 7 | 8 | /** 9 | * Created by Daniel Hinojosa 10 | * User: Daniel Hinojosa 11 | * Date: 5/31/12 12 | * Time: 12:36 PM 13 | * url: http://www.evolutionnext.com 14 | * email: dhinojosa@evolutionnext.com 15 | * tel: 505.363.5832 16 | */ 17 | public class UsingGuavaBuilders { 18 | 19 | public static void main(String[] args) { 20 | ImmutableList.builder().add(1).add(3,4,5).add(3).build(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/observer/RSSFeed.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.observer; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * @author John Ericksen 8 | */ 9 | public class RSSFeed { 10 | 11 | private List observers = new ArrayList(); 12 | 13 | public void broadcast(RSSEntry entry) { 14 | for (RSSObserver observer : observers) { 15 | observer.update(entry); 16 | } 17 | } 18 | 19 | public RSSObserver addObserver(RSSObserver observer) { 20 | observers.add(observer); 21 | return observer; 22 | } 23 | 24 | public void removeObserver(RSSObserver observer) { 25 | observers.remove(observer); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/cleaner/Runner.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.cleaner; 2 | 3 | import org.abqjug.javapatterns.abstractfactory.classic.Client; 4 | import org.abqjug.javapatterns.abstractfactory.classic.DAOType; 5 | import org.abqjug.javapatterns.abstractfactory.classic.RegistrationDAOAbstractFactory; 6 | 7 | import javax.sql.DataSource; 8 | 9 | /** 10 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 11 | * Date: 5/29/12 12 | * Time: 10:31 PM 13 | */ 14 | public class Runner { 15 | 16 | public static void main(String[] args) { 17 | 18 | RegistrationDAO registrationDAO = new RegistrationDAOCompositeFactory().create(); 19 | registrationDAO.persist(new Registration()); 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/cleaner/MySQLRegistrationDAO.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.cleaner; 2 | 3 | 4 | import javax.sql.DataSource; 5 | 6 | /** 7 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 8 | * Date: 5/29/12 9 | * Time: 5:55 PM 10 | */ 11 | public class MySQLRegistrationDAO extends RegistrationDAO { 12 | private DataSource dataSource; 13 | 14 | public MySQLRegistrationDAO() { 15 | 16 | } 17 | 18 | @Override 19 | public void setDataSource(DataSource dataSource) { 20 | this.dataSource = dataSource; 21 | } 22 | 23 | @Override 24 | public void persist(Registration registration) { 25 | } 26 | 27 | @Override 28 | public void update(Registration registration) { 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/strategy/Client.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.strategy; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 8 | * Date: 5/30/12 9 | * Time: 12:54 PM 10 | */ 11 | public class Client { 12 | 13 | public static void main(String[] args) { 14 | NumberAccumulator numberAccumulator = new NumberAccumulator(); 15 | numberAccumulator.setAccumulatorStrategy(new ProductAccumulator()); 16 | 17 | List integers = new ArrayList(); 18 | integers.add(1); 19 | integers.add(2); 20 | integers.add(3); 21 | integers.add(4); 22 | 23 | assert numberAccumulator.accumulate(integers) == 24; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/builder/custom/EspressoDrink.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.builder.custom; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/29/12 6 | * Time: 10:58 PM 7 | */ 8 | public class EspressoDrink { 9 | private int shots; 10 | private boolean skimMilk; 11 | private boolean sprinkles; 12 | private boolean decaf; 13 | private boolean whip; 14 | 15 | protected EspressoDrink(EspressoDrinkBuilder espressoDrinkBuilder) { 16 | this.shots = espressoDrinkBuilder.getShots(); 17 | this.skimMilk = espressoDrinkBuilder.isSkimMilk(); 18 | this.sprinkles = espressoDrinkBuilder.isSprinkles(); 19 | this.decaf = espressoDrinkBuilder.isDecaf(); 20 | this.whip = espressoDrinkBuilder.isWhip(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/observer/ObserverDemonstration.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.observer; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * @author John Ericksen 7 | */ 8 | public class ObserverDemonstration { 9 | 10 | public static void main(String[] args) { 11 | 12 | RSSFeed johnsFeed = new RSSFeed(); 13 | 14 | johnsFeed.addObserver(new ConsoleOutObserver("Console 1")); 15 | RSSObserver console2 = johnsFeed.addObserver(new ConsoleOutObserver("Console 2")); 16 | johnsFeed.addObserver(new LoggingObserver(new File("/home/john/Desktop/rss.txt"))); 17 | 18 | johnsFeed.broadcast(new RSSEntry("ABQJUG Rocks!")); 19 | 20 | johnsFeed.removeObserver(console2); 21 | 22 | johnsFeed.broadcast(new RSSEntry("ABQJUG Meeting Announcement")); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/observer/LoggingObserver.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.observer; 2 | 3 | import java.io.File; 4 | import java.io.FileWriter; 5 | import java.io.IOException; 6 | 7 | /** 8 | * @author John Ericksen 9 | */ 10 | public class LoggingObserver implements RSSObserver { 11 | 12 | private FileWriter log; 13 | 14 | public LoggingObserver(File log) { 15 | try { 16 | this.log = new FileWriter(log); 17 | } catch (IOException e) { 18 | e.printStackTrace(); 19 | } 20 | } 21 | 22 | public void update(RSSEntry entry) { 23 | 24 | try { 25 | log.write(entry.getValue()); 26 | log.write('\n'); 27 | log.flush(); 28 | } catch (IOException e) { 29 | e.printStackTrace(); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/virtual/PuzzleBuilder.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy.virtual; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class PuzzleBuilder { 7 | 8 | public static void main(String[] args) { 9 | 10 | PuzzlePiece3Proxy puzzle3 = new PuzzlePiece3Proxy(); 11 | PuzzlePiece2 puzzle2 = new PuzzlePiece2(puzzle3); 12 | PuzzlePiece1 puzzle1 = new PuzzlePiece1(puzzle2); 13 | 14 | 15 | puzzle3.setProxied(new PuzzlePiece3Impl(puzzle1)); 16 | } 17 | 18 | /* 19 | PuzzlePiece3Proxy piece3Proxy = new PuzzlePiece3Proxy(); 20 | PuzzlePiece2 piece2 = new PuzzlePiece2(piece3Proxy); 21 | PuzzlePiece1 piece1 = new PuzzlePiece1(piece2); 22 | PuzzlePiece3 puzzlePiece3 = new PuzzlePiece3Impl(piece1); 23 | piece3Proxy.setProxied(puzzlePiece3); 24 | */ 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/classic/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Abstract Factories is a creation pattern that encapsulates a group of 3 | * individual factories that have a common theme. 4 | * 5 | * 1. The Client software creates a concrete implementation of the abstract 6 | * factory and then uses the generic interfaces 7 | * to create the concrete objects that are part of the theme. 8 | * 9 | * 2. The client does not know (or care) which concrete objects it gets from 10 | * each of these internal factories, since it uses 11 | * only the generic interfaces of their products. 12 | * 13 | * 3. This pattern separates the details of implementation of a set of 14 | * objects from their general usage. 15 | * 16 | * 4. Avoids obsessive use of if statements to determine what gets created. 17 | * 18 | */ 19 | package org.abqjug.javapatterns.abstractfactory.classic; -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/cleaner/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Abstract Factories is a creation pattern that encapsulates a group of 3 | * individual factories that have a common theme. 4 | * 5 | * 1. The Client software creates a concrete implementation of the abstract 6 | * factory and then uses the generic interfaces 7 | * to create the concrete objects that are part of the theme. 8 | * 9 | * 2. The client does not know (or care) which concrete objects it gets from 10 | * each of these internal factories, since it uses 11 | * only the generic interfaces of their products. 12 | * 13 | * 3. This pattern separates the details of implementation of a set of 14 | * objects from their general usage. 15 | * 16 | * 4. Avoids obsessive use of if statements to determine what gets created. 17 | * 18 | */ 19 | package org.abqjug.javapatterns.abstractfactory.cleaner; -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/flyweight/custom/StarWarsActionFigureFactory.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.flyweight.custom; 2 | 3 | import java.util.HashMap; 4 | 5 | /** 6 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 7 | * Date: 5/30/12 8 | * Time: 10:10 AM 9 | */ 10 | public class StarWarsActionFigureFactory { 11 | private HashMap flyweights; 12 | 13 | public StarWarsActionFigureFactory() { 14 | this.flyweights = new HashMap(); 15 | } 16 | 17 | public StarWarsActionFigure getInstance(String name) { 18 | if (flyweights.containsKey(name)) return flyweights.get(name); 19 | else { 20 | StarWarsActionFigure starWarsActionFigure = new StarWarsActionFigure(name); 21 | flyweights.put(name, starWarsActionFigure); 22 | return starWarsActionFigure; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/memento/immutable/Client.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.memento.immutable; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Date; 5 | import java.util.List; 6 | 7 | /** 8 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 9 | * Date: 5/30/12 10 | * Time: 11:46 AM 11 | */ 12 | public class Client { 13 | public static void main(String[] args) { 14 | List caretaker = new ArrayList(); 15 | 16 | Messenger messenger = new Messenger(); 17 | caretaker.add(messenger.postNextMessage(new Message(new Date(), "Hello", "Dan"))); 18 | caretaker.add(messenger.postNextMessage(new Message(new Date(), "Hello", "John"))); 19 | caretaker.add(messenger.postNextMessage(new Message(new Date(), "Hello", "Dwight"))); 20 | 21 | //rollback? 22 | assert caretaker.get(0).getCurrentMessage().getReceiver().equals("Dan"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/cleaner/OracleRegistrationDAO.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.cleaner; 2 | 3 | 4 | import javax.sql.DataSource; 5 | 6 | /** 7 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 8 | * Date: 5/29/12 9 | * Time: 5:55 PM 10 | */ 11 | public class OracleRegistrationDAO extends RegistrationDAO { 12 | private DataSource dataSource; 13 | 14 | public OracleRegistrationDAO() { 15 | 16 | } 17 | 18 | @Override 19 | public void setDataSource(DataSource dataSource) { 20 | this.dataSource = dataSource; 21 | } 22 | 23 | @Override 24 | public void persist(Registration registration) { 25 | //To change body of implemented methods use File | Settings | File Templates. 26 | } 27 | 28 | @Override 29 | public void update(Registration registration) { 30 | //To change body of implemented methods use File | Settings | File Templates. 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /javapatterns.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/decorator/DecoratorDemonstration.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.decorator; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class DecoratorDemonstration { 7 | 8 | public static void main(String[] args) { 9 | 10 | Sundae sundae = new NutsSundaeDecorator( 11 | new FudgeSundaeDecorator( 12 | new WhipcreamSundaeDecorator( 13 | new VanillaIceCream() 14 | ) 15 | ) 16 | ); 17 | 18 | System.out.println(sundae.describeSundae()); 19 | 20 | //add a cherry 21 | 22 | Sundae cherryOnTopDecorator = new CherryOnTopDecorator(sundae); 23 | 24 | System.out.println(cherryOnTopDecorator.describeSundae()); 25 | 26 | Sundae filteredFudge = new FudgeFilterDecorator(cherryOnTopDecorator); 27 | 28 | System.out.println(filteredFudge.describeSundae()); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/LoggingProxy.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class LoggingProxy implements Target { 7 | 8 | private Target proxied; 9 | 10 | public LoggingProxy(Target proxied) { 11 | this.proxied = proxied; 12 | } 13 | 14 | public void callMe() { 15 | long start = before("callMe()"); 16 | proxied.callMe(); 17 | after("callMe()", start); 18 | } 19 | 20 | public void takeSomeTime() { 21 | long start = before("takeSomeTime()"); 22 | proxied.takeSomeTime(); 23 | after("takeSomeTime()", start); 24 | } 25 | 26 | private long before(String name) { 27 | System.out.println("Before " + name); 28 | return System.currentTimeMillis(); 29 | } 30 | 31 | private void after(String name, long start) { 32 | System.out.println("After: " + name + " took: " + (System.currentTimeMillis() - start)); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/memento/mutable/Client.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.memento.mutable; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Date; 5 | import java.util.List; 6 | 7 | /** 8 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 9 | * Date: 5/30/12 10 | * Time: 11:46 AM 11 | */ 12 | public class Client { 13 | public static void main(String[] args) { 14 | List caretaker = new ArrayList(); 15 | 16 | Messenger messenger = new Messenger(); 17 | messenger.postNextMessage(new Message(new Date(), "Hello", "Dan")); 18 | caretaker.add(messenger.getMemento()); 19 | 20 | messenger.postNextMessage(new Message(new Date(), "Hello", "John")); 21 | caretaker.add(messenger.getMemento()); 22 | 23 | messenger.postNextMessage(new Message(new Date(), "Hello", "Dwight")); 24 | caretaker.add(messenger.getMemento()); 25 | 26 | messenger.setMemento(caretaker.get(0)); //rollback all the way 27 | assert messenger.getCurrentMessage().getReceiver().equals("Dan"); 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/flyweight/custom/StarWarsActionFigure.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.flyweight.custom; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/30/12 6 | * Time: 10:13 AM 7 | */ 8 | public class StarWarsActionFigure { 9 | private String name; 10 | 11 | protected StarWarsActionFigure(String name) { 12 | this.name = name; 13 | } 14 | 15 | public String getName() {return name;} 16 | 17 | @Override 18 | public boolean equals(Object o) { 19 | if (this == o) return true; 20 | if (o == null || getClass() != o.getClass()) return false; 21 | 22 | StarWarsActionFigure that = (StarWarsActionFigure) o; 23 | 24 | if (name != null ? !name.equals(that.name) : that.name != null) return false; 25 | 26 | return true; 27 | } 28 | 29 | @Override 30 | public int hashCode() { 31 | return name != null ? name.hashCode() : 0; 32 | } 33 | 34 | @Override 35 | public String toString() { 36 | return "StarWarsActionFigure{" + 37 | "name='" + name + '\'' + 38 | '}'; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/visitor/VisitorDemonstration.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.visitor; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.List; 6 | 7 | /** 8 | * @author John Ericksen 9 | */ 10 | public class VisitorDemonstration { 11 | 12 | public static void main(String[] args) { 13 | new VisitorDemonstration().runZoo(); 14 | } 15 | 16 | public void runZoo() { 17 | 18 | List zoo = buildZoo(); 19 | 20 | System.out.println("Animals:"); 21 | 22 | for (Animal animal : zoo) { 23 | animal.accept(new AnimalNameVisitor()); 24 | } 25 | 26 | System.out.println("Feeding Time!"); 27 | 28 | for (Animal animal : zoo) { 29 | animal.accept(new AnimalFeederVisitor()); 30 | } 31 | } 32 | 33 | private List buildZoo() { 34 | List zoo = new ArrayList(); 35 | 36 | zoo.add(new Lion()); 37 | zoo.add(new Bear()); 38 | zoo.add(new Elephant()); 39 | zoo.add(new Zebra()); 40 | zoo.add(new Monkey()); 41 | 42 | Collections.shuffle(zoo); 43 | 44 | return zoo; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/payment/BankAccount.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy.payment; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class BankAccount { 7 | 8 | private int balance; 9 | private String name; 10 | 11 | public BankAccount(String name, int balance) { 12 | this.balance = balance; 13 | this.name = name; 14 | } 15 | 16 | public int getBalance() { 17 | return balance; 18 | } 19 | 20 | public synchronized Payment withdraw(int amount) { 21 | balance -= amount; 22 | return new Money(amount); 23 | } 24 | 25 | public synchronized Payment withdrawSecured(Authority authority, int amount) { 26 | return new SecuredPayment(authority, withdraw(amount)); 27 | } 28 | 29 | public synchronized void deposit(Payment money) { 30 | balance += money.withdraw(); 31 | } 32 | 33 | public Payment cutCheck(int amount) { 34 | return new Check(this, amount); 35 | } 36 | 37 | @Override 38 | public String toString() { 39 | return "\t" + name + " Balance: " + balance; 40 | } 41 | 42 | public void setBalance(int balance) { 43 | this.balance = balance; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/abstractfactory/cleaner/RegistrationDAOCompositeFactory.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.abstractfactory.cleaner; 2 | 3 | import javax.sql.DataSource; 4 | 5 | /** 6 | * Created by Daniel Hinojosa 7 | * User: Daniel Hinojosa 8 | * Date: 5/31/12 9 | * Time: 12:11 PM 10 | * url: http://www.evolutionnext.com 11 | * email: dhinojosa@evolutionnext.com 12 | * tel: 505.363.5832 13 | */ 14 | public class RegistrationDAOCompositeFactory { 15 | 16 | private MySQLRegistrationDAOFactory mySQLRegistrationDAOFactory; 17 | private OracleRegistrationDAOFactory oracleRegistrationDAOFactory; 18 | 19 | public RegistrationDAO create() { 20 | String type = System.getProperty("daoType"); 21 | DAOType daoType = null; 22 | try { 23 | daoType = DAOType.valueOf(type); 24 | } catch (IllegalArgumentException iae) { 25 | daoType = DAOType.MYSQL; 26 | } 27 | 28 | if (daoType.equals(DAOType.MYSQL)) { 29 | mySQLRegistrationDAOFactory = new MySQLRegistrationDAOFactory(); 30 | return mySQLRegistrationDAOFactory.create(); 31 | } 32 | 33 | oracleRegistrationDAOFactory = new OracleRegistrationDAOFactory(); 34 | return oracleRegistrationDAOFactory.create(); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/builder/custom/EspressoDrinkBuilder.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.builder.custom; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/29/12 6 | * Time: 10:47 PM 7 | */ 8 | public class EspressoDrinkBuilder { 9 | 10 | private boolean decaf; 11 | private boolean whip; 12 | private boolean sprinkles; 13 | private boolean skimMilk; 14 | private int shots; 15 | 16 | public EspressoDrinkBuilder(int shots) { 17 | this.shots = shots; 18 | } 19 | 20 | public EspressoDrinkBuilder addWhip() { 21 | this.whip = true; 22 | return this; 23 | } 24 | 25 | public EspressoDrinkBuilder addSprinkles() { 26 | this.sprinkles = true; 27 | return this; 28 | } 29 | 30 | public EspressoDrinkBuilder addSkimMilk() { 31 | this.skimMilk = true; 32 | return this; 33 | } 34 | 35 | public EspressoDrinkBuilder setDecaf() { 36 | this.decaf = true; 37 | return this; 38 | } 39 | 40 | public EspressoDrink build() { 41 | return new EspressoDrink(this); 42 | } 43 | 44 | public boolean isDecaf() { 45 | return decaf; 46 | } 47 | 48 | public boolean isWhip() { 49 | return whip; 50 | } 51 | 52 | public boolean isSprinkles() { 53 | return sprinkles; 54 | } 55 | 56 | public boolean isSkimMilk() { 57 | return skimMilk; 58 | } 59 | 60 | public int getShots() { 61 | return shots; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 5 | 4.0.0 6 | 7 | org.abqjug 8 | javapatterns 9 | 0.1-SNAPSHOT 10 | 11 | 12 | 13 | maven-compiler-plugin 14 | 15 | 1.6 16 | 1.6 17 | -proc:none 18 | 19 | 20 | 21 | org.apache.maven.plugins 22 | maven-javadoc-plugin 23 | 24 | 1.6 25 | true 26 | gr.spinellis.umlgraph.doclet.UmlGraphDoc 27 | 28 | gr.spinellis 29 | UmlGraph 30 | 4.6 31 | 32 | 33 | -inferrel 34 | -inferdep 35 | -quiet 36 | -constructors 37 | -visibility 38 | -types 39 | -postfixpackage 40 | -nodefontsize 9 41 | -nodefontpackagesize 7 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | com.google.guava 51 | guava 52 | 11.0.2 53 | 54 | 55 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/memento/immutable/Message.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.memento.immutable; 2 | 3 | import java.util.Date; 4 | 5 | /** 6 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 7 | * Date: 5/30/12 8 | * Time: 11:37 AM 9 | */ 10 | public class Message { 11 | private Date date; 12 | private String message; 13 | private String receiver; 14 | 15 | public Message(Date date, String message, String receiver) { 16 | this.date = date; 17 | this.message = message; 18 | this.receiver = receiver; 19 | } 20 | 21 | public Date getDate() { 22 | return date; 23 | } 24 | 25 | public String getMessage() { 26 | return message; 27 | } 28 | 29 | public String getReceiver() { 30 | return receiver; 31 | } 32 | 33 | @Override 34 | public boolean equals(Object o) { 35 | if (this == o) return true; 36 | if (o == null || getClass() != o.getClass()) return false; 37 | 38 | Message message1 = (Message) o; 39 | 40 | if (date != null ? !date.equals(message1.date) : message1.date != null) return false; 41 | if (message != null ? !message.equals(message1.message) : message1.message != null) return false; 42 | if (receiver != null ? !receiver.equals(message1.receiver) : message1.receiver != null) return false; 43 | 44 | return true; 45 | } 46 | 47 | @Override 48 | public int hashCode() { 49 | int result = date != null ? date.hashCode() : 0; 50 | result = 31 * result + (message != null ? message.hashCode() : 0); 51 | result = 31 * result + (receiver != null ? receiver.hashCode() : 0); 52 | return result; 53 | } 54 | 55 | @Override 56 | public String toString() { 57 | return "Message{" + 58 | "date=" + date + 59 | ", message='" + message + '\'' + 60 | ", receiver='" + receiver + '\'' + 61 | '}'; 62 | } 63 | 64 | public Message copy() { 65 | return new Message(date, message, receiver); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/composite/Operand.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.composite; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class Operand extends ArithmeticExpression { 7 | 8 | public enum Operation { 9 | PLUS("+") { 10 | @Override 11 | public double calculate(ArithmeticExpression rhs, ArithmeticExpression lhs) { 12 | return rhs.calculate() + lhs.calculate(); 13 | } 14 | }, 15 | MINUS("-") { 16 | @Override 17 | public double calculate(ArithmeticExpression rhs, ArithmeticExpression lhs) { 18 | return rhs.calculate() - lhs.calculate(); 19 | } 20 | }, 21 | MULTIPLICATION("*") { 22 | @Override 23 | public double calculate(ArithmeticExpression rhs, ArithmeticExpression lhs) { 24 | return rhs.calculate() * lhs.calculate(); 25 | } 26 | }, 27 | DIVISION("/") { 28 | @Override 29 | public double calculate(ArithmeticExpression rhs, ArithmeticExpression lhs) { 30 | return rhs.calculate() / lhs.calculate(); 31 | } 32 | }; 33 | 34 | private String op; 35 | 36 | private Operation(String op) { 37 | this.op = op; 38 | } 39 | 40 | public abstract double calculate(ArithmeticExpression rhs, ArithmeticExpression lhs); 41 | 42 | public String getOp() { 43 | return op; 44 | } 45 | } 46 | 47 | private final ArithmeticExpression rhs; 48 | private final ArithmeticExpression lhs; 49 | private Operation operation; 50 | 51 | public Operand(ArithmeticExpression rhs, Operation operation, ArithmeticExpression lhs) { 52 | this.rhs = rhs; 53 | this.lhs = lhs; 54 | this.operation = operation; 55 | } 56 | 57 | @Override 58 | public double calculate() { 59 | return operation.calculate(rhs, lhs); 60 | } 61 | 62 | @Override 63 | public String toString() { 64 | return "( " + rhs.toString() + " " + operation.getOp() + " " + lhs.toString() + " )"; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/singleton/lazy/RightLazySingletonClient.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.singleton.lazy; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/30/12 6 | * Time: 12:23 PM 7 | */ 8 | public class RightLazySingletonClient { 9 | public static class SingletonRunner implements Runnable { 10 | private RightLazySingleton instance; 11 | 12 | public RightLazySingleton getInstance() { 13 | return instance; 14 | } 15 | 16 | public void run() { 17 | try { 18 | Thread.sleep(1000); 19 | } catch (InterruptedException e) { 20 | e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 21 | } 22 | instance = RightLazySingleton.getInstance(); 23 | try { 24 | Thread.sleep(1000); 25 | } catch (InterruptedException e) { 26 | e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 27 | } 28 | } 29 | } 30 | 31 | 32 | public static void main(String[] args) throws InterruptedException { 33 | SingletonRunner runner1 = new SingletonRunner(); 34 | SingletonRunner runner2 = new SingletonRunner(); 35 | SingletonRunner runner3 = new SingletonRunner(); 36 | SingletonRunner runner4 = new SingletonRunner(); 37 | 38 | Thread t1 = new Thread(runner1); 39 | Thread t2 = new Thread(runner2); 40 | Thread t3 = new Thread(runner3); 41 | Thread t4 = new Thread(runner4); 42 | 43 | t1.start(); 44 | t2.start(); 45 | t3.start(); 46 | t4.start(); 47 | 48 | t1.join(); 49 | t2.join(); 50 | t3.join(); 51 | t4.join(); 52 | 53 | assert runner1.getInstance() == runner2.getInstance(); 54 | assert runner2.getInstance() == runner3.getInstance(); 55 | assert runner3.getInstance() == runner4.getInstance(); 56 | assert runner4.getInstance() == runner1.getInstance(); 57 | assert runner2.getInstance() == runner4.getInstance(); 58 | assert runner3.getInstance() == runner1.getInstance(); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/singleton/lazy/WrongLazySingletonClient.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.singleton.lazy; 2 | 3 | /** 4 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 5 | * Date: 5/30/12 6 | * Time: 12:23 PM 7 | */ 8 | public class WrongLazySingletonClient { 9 | public static class SingletonRunner implements Runnable { 10 | private WrongLazySingleton instance; 11 | 12 | public WrongLazySingleton getInstance() { 13 | return instance; 14 | } 15 | 16 | public void run() { 17 | try { 18 | Thread.sleep(1000); 19 | } catch (InterruptedException e) { 20 | e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 21 | } 22 | instance = WrongLazySingleton.getInstance(); 23 | try { 24 | Thread.sleep(1000); 25 | } catch (InterruptedException e) { 26 | e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 27 | } 28 | } 29 | } 30 | 31 | 32 | public static void main(String[] args) throws InterruptedException { 33 | SingletonRunner runner1 = new SingletonRunner(); 34 | SingletonRunner runner2 = new SingletonRunner(); 35 | SingletonRunner runner3 = new SingletonRunner(); 36 | SingletonRunner runner4 = new SingletonRunner(); 37 | 38 | Thread t1 = new Thread(runner1); 39 | Thread t2 = new Thread(runner2); 40 | Thread t3 = new Thread(runner3); 41 | Thread t4 = new Thread(runner4); 42 | 43 | t1.start(); 44 | t2.start(); 45 | t3.start(); 46 | t4.start(); 47 | 48 | t1.join(); 49 | t2.join(); 50 | t3.join(); 51 | t4.join(); 52 | 53 | assert runner1.getInstance() == runner2.getInstance(); 54 | assert runner2.getInstance() == runner3.getInstance(); 55 | assert runner3.getInstance() == runner4.getInstance(); 56 | assert runner4.getInstance() == runner1.getInstance(); 57 | assert runner2.getInstance() == runner4.getInstance(); 58 | assert runner3.getInstance() == runner1.getInstance(); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/memento/mutable/Message.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.memento.mutable; 2 | 3 | import java.util.Date; 4 | 5 | /** 6 | * User: Daniel Hinojosa (dhinojosa@evolutionnext.com) 7 | * Date: 5/30/12 8 | * Time: 11:37 AM 9 | */ 10 | public class Message { 11 | private Date date; 12 | private String message; 13 | private String receiver; 14 | 15 | public Message(Date date, String message, String receiver) { 16 | this.date = date; 17 | this.message = message; 18 | this.receiver = receiver; 19 | } 20 | 21 | public Date getDate() { 22 | return date; 23 | } 24 | 25 | public void setDate(Date date) { 26 | this.date = date; 27 | } 28 | 29 | public String getMessage() { 30 | return message; 31 | } 32 | 33 | public void setMessage(String message) { 34 | this.message = message; 35 | } 36 | 37 | public String getReceiver() { 38 | return receiver; 39 | } 40 | 41 | public void setReceiver(String receiver) { 42 | this.receiver = receiver; 43 | } 44 | 45 | @Override 46 | public boolean equals(Object o) { 47 | if (this == o) return true; 48 | if (o == null || getClass() != o.getClass()) return false; 49 | 50 | Message message1 = (Message) o; 51 | 52 | if (date != null ? !date.equals(message1.date) : message1.date != null) return false; 53 | if (message != null ? !message.equals(message1.message) : message1.message != null) return false; 54 | if (receiver != null ? !receiver.equals(message1.receiver) : message1.receiver != null) return false; 55 | 56 | return true; 57 | } 58 | 59 | @Override 60 | public int hashCode() { 61 | int result = date != null ? date.hashCode() : 0; 62 | result = 31 * result + (message != null ? message.hashCode() : 0); 63 | result = 31 * result + (receiver != null ? receiver.hashCode() : 0); 64 | return result; 65 | } 66 | 67 | @Override 68 | public String toString() { 69 | return "Message{" + 70 | "date=" + date + 71 | ", message='" + message + '\'' + 72 | ", receiver='" + receiver + '\'' + 73 | '}'; 74 | } 75 | 76 | public Message copy() { 77 | return new Message(date, message, receiver); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/main/java/org/abqjug/javapatterns/proxy/payment/PaymentDemonstration.java: -------------------------------------------------------------------------------- 1 | package org.abqjug.javapatterns.proxy.payment; 2 | 3 | /** 4 | * @author John Ericksen 5 | */ 6 | public class PaymentDemonstration { 7 | 8 | public static void main(String[] args) { 9 | 10 | PaymentDemonstration demonstration = new PaymentDemonstration(); 11 | 12 | demonstration.direct(); 13 | demonstration.check(); 14 | demonstration.authorization(); 15 | } 16 | 17 | public void direct() { 18 | System.out.println("Direct Money Transfer"); 19 | 20 | BankAccount bankAccount1 = new BankAccount("One", 10000); 21 | BankAccount bankAccount2 = new BankAccount("Two", 100); 22 | 23 | logAccounts("Before withdraw", bankAccount1, bankAccount2); 24 | 25 | Payment oneHundred = bankAccount1.withdraw(100); 26 | 27 | logAccounts("After withdraw", bankAccount1, bankAccount2); 28 | 29 | bankAccount2.deposit(oneHundred); 30 | 31 | logAccounts("After Deposit", bankAccount1, bankAccount2); 32 | } 33 | 34 | public void check() { 35 | System.out.println("Check Money Transfer"); 36 | BankAccount bankAccount1 = new BankAccount("One", 10000); 37 | BankAccount bankAccount2 = new BankAccount("Two", 100); 38 | 39 | logAccounts("Before withdraw", bankAccount1, bankAccount2); 40 | 41 | Payment check = bankAccount1.cutCheck(100); 42 | 43 | logAccounts("After withdraw", bankAccount1, bankAccount2); 44 | 45 | bankAccount2.deposit(check); 46 | 47 | logAccounts("After Deposit", bankAccount1, bankAccount2); 48 | } 49 | 50 | private void authorization() { 51 | System.out.println("Check Money Transfer"); 52 | BankAccount bankAccount1 = new BankAccount("One", 10000); 53 | BankAccount bankAccount2 = new BankAccount("Two", 100); 54 | Authority authority = new Authority(); 55 | 56 | logAccounts("Before withdraw", bankAccount1, bankAccount2); 57 | 58 | Payment check = bankAccount1.withdrawSecured(authority, 100); 59 | 60 | logAccounts("After withdraw", bankAccount1, bankAccount2); 61 | 62 | bankAccount2.deposit(check); 63 | 64 | logAccounts("After Deposit", bankAccount1, bankAccount2); 65 | 66 | authority.authorize("please"); 67 | 68 | bankAccount2.deposit(check); 69 | 70 | logAccounts("After Magic Word", bankAccount1, bankAccount2); 71 | } 72 | 73 | private void logAccounts(String message, BankAccount bankAccount1, BankAccount bankAccount2) { 74 | System.out.println(message); 75 | System.out.println(bankAccount1); 76 | System.out.println(bankAccount2); 77 | } 78 | } 79 | --------------------------------------------------------------------------------