├── .gitignore ├── pom.xml └── src └── main └── java └── com └── hollischuang └── pattern ├── AbstractFactory ├── BenzBusinessCar.java ├── BenzCar.java ├── BenzSportCar.java ├── TeslaBusinessCar.java ├── TeslaCar.java ├── TeslaSportCar.java ├── client │ └── Main.java └── factory │ ├── BusinessCarFactory.java │ ├── CarFactory.java │ └── SportCarFactory.java ├── Adapter ├── Adapter.java ├── AndroidCharger.java ├── AppleCharger.java ├── GalaxyS7.java ├── Iphone6Plus.java ├── LightningInterface.java ├── Main.java └── MicroUsbInterface.java ├── Builder ├── Builder.java ├── CommonRoleBuilder.java ├── Director.java ├── Main.java ├── Role.java └── SuperRoleBuilder.java ├── FactoryMethod ├── Operation.java ├── OperationAdd.java ├── OperationDiv.java ├── OperationMul.java ├── OperationSub.java ├── client │ └── Main.java └── factory │ ├── AddFactory.java │ ├── DivFactory.java │ ├── IFactory.java │ ├── MulFactory.java │ └── SubFactory.java ├── Iterator ├── ChineseFoodMenu.java ├── Iterator.java ├── Main.java ├── Menu.java └── MenuIterator.java ├── Singlenton ├── Enum │ └── Singleton.java ├── Serializable │ └── Singleton.java ├── client │ └── SingletonClient.java ├── double_check │ ├── FinalSingleton.java │ ├── Singleton.java │ └── VolatileSingleton.java ├── hangry │ ├── Singleton.java │ └── Singleton2.java └── lazy │ ├── Singleton.java │ ├── StaticInnerClassSingleton.java │ └── SynchronizedSingleton.java ├── StaticFactory └── Main.java ├── Strategy ├── AdvancedMember.java ├── BookStore.java ├── Cashier.java ├── IntermediateMember.java ├── Member.java └── PrimaryMember.java └── staticfactory ├── Operation.java ├── OperationAdd.java ├── OperationDiv.java ├── OperationFactory.java ├── OperationMul.java └── OperationSub.java /.gitignore: -------------------------------------------------------------------------------- 1 | .classpath 2 | .project 3 | .settings 4 | .idea 5 | .DS_Store 6 | *.class 7 | *.iml 8 | # maven 9 | target/* 10 | *.versionsBackup 11 | bin/ 12 | .sftp-config.json 13 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | 9 | Hollis 10 | hollischuang@qq.com 11 | http://www.hollischuang.com 12 | 13 | 14 | 15 | 16 | com.hollischuang 17 | design.pattern 18 | 1.0-SNAPSHOT 19 | Java 设计模式 20 | 21 | 22 | 23 | 24 | org.apache.maven.plugins 25 | maven-compiler-plugin 26 | 2.3.2 27 | 28 | 1.8 29 | 1.8 30 | UTF-8 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/AbstractFactory/BenzBusinessCar.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.AbstractFactory; 2 | 3 | /** 4 | * Created by hollis on 16/4/14. 5 | * 本次跑车 6 | */ 7 | public class BenzBusinessCar implements BenzCar{ 8 | 9 | public void gasUp() { 10 | System.out.println("给我的奔驰商务车加一般的汽油"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/AbstractFactory/BenzCar.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.AbstractFactory; 2 | 3 | /** 4 | * Created by hollis on 16/4/14. 5 | */ 6 | public interface BenzCar { 7 | 8 | //加汽油 9 | public void gasUp(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/AbstractFactory/BenzSportCar.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.AbstractFactory; 2 | 3 | /** 4 | * Created by hollis on 16/4/14. 5 | */ 6 | public class BenzSportCar implements BenzCar { 7 | 8 | public void gasUp() { 9 | System.out.println("给我的奔驰跑车加最好的汽油"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/AbstractFactory/TeslaBusinessCar.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.AbstractFactory; 2 | 3 | /** 4 | * Created by hollis on 16/4/14. 5 | */ 6 | public class TeslaBusinessCar implements TeslaCar { 7 | public void charge() { 8 | System.out.println("不用给我特斯拉商务车冲满电"); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/AbstractFactory/TeslaCar.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.AbstractFactory; 2 | 3 | /** 4 | * Created by hollis on 16/4/14. 5 | */ 6 | public interface TeslaCar { 7 | 8 | //充电 9 | public void charge(); 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/AbstractFactory/TeslaSportCar.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.AbstractFactory; 2 | 3 | /** 4 | * Created by hollis on 16/4/14. 5 | */ 6 | public class TeslaSportCar implements TeslaCar { 7 | public void charge() { 8 | System.out.println("给我特斯拉跑车冲满电"); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/AbstractFactory/client/Main.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.AbstractFactory.client; 2 | import com.hollischuang.pattern.AbstractFactory.TeslaCar; 3 | import com.hollischuang.pattern.AbstractFactory.factory.SportCarFactory; 4 | 5 | /** 6 | * Created by hollis on 16/4/12. 7 | */ 8 | public class Main { 9 | 10 | public static void main(String[] args) { 11 | 12 | SportCarFactory sportCarFactory = new SportCarFactory(); 13 | TeslaCar teslaCar = sportCarFactory.getTeslaCar(); 14 | teslaCar.charge(); 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/AbstractFactory/factory/BusinessCarFactory.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.AbstractFactory.factory; 2 | 3 | import com.hollischuang.pattern.AbstractFactory.*; 4 | 5 | /** 6 | * Created by hollis on 16/4/14. 7 | * 商务车工厂类 8 | */ 9 | public class BusinessCarFactory implements CarFactory { 10 | public BenzCar getBenzCar() { 11 | return new BenzBusinessCar(); 12 | } 13 | 14 | public TeslaCar getTeslaCar() { 15 | return new TeslaBusinessCar(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/AbstractFactory/factory/CarFactory.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.AbstractFactory.factory; 2 | 3 | import com.hollischuang.pattern.AbstractFactory.BenzCar; 4 | import com.hollischuang.pattern.AbstractFactory.TeslaCar; 5 | 6 | /** 7 | * Created by hollis on 16/4/14. 8 | * 工厂接口 9 | */ 10 | public interface CarFactory { 11 | 12 | public BenzCar getBenzCar(); 13 | public TeslaCar getTeslaCar(); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/AbstractFactory/factory/SportCarFactory.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.AbstractFactory.factory; 2 | 3 | import com.hollischuang.pattern.AbstractFactory.BenzCar; 4 | import com.hollischuang.pattern.AbstractFactory.BenzSportCar; 5 | import com.hollischuang.pattern.AbstractFactory.TeslaCar; 6 | import com.hollischuang.pattern.AbstractFactory.TeslaSportCar; 7 | 8 | /** 9 | * Created by hollis on 16/4/14. 10 | * 跑车工厂类 11 | */ 12 | public class SportCarFactory implements CarFactory { 13 | public BenzCar getBenzCar() { 14 | return new BenzSportCar(); 15 | } 16 | 17 | public TeslaCar getTeslaCar() { 18 | return new TeslaSportCar(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Adapter/Adapter.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Adapter; 2 | 3 | /** 4 | * Created by hollis on 16/5/10. 5 | * 适配器,将MicroUsb接口转成Lightning接口 6 | */ 7 | public class Adapter implements LightningInterface { 8 | private MicroUsbInterface microUsbInterface; 9 | 10 | public Adapter() { 11 | } 12 | 13 | public Adapter(MicroUsbInterface microUsbInterface) { 14 | this.microUsbInterface = microUsbInterface; 15 | } 16 | 17 | @Override 18 | public void chargeWithLightning() { 19 | microUsbInterface.chargeWithMicroUsb(); 20 | } 21 | 22 | public MicroUsbInterface getMicroUsbInterface() { 23 | return microUsbInterface; 24 | } 25 | 26 | public void setMicroUsbInterface(MicroUsbInterface microUsbInterface) { 27 | this.microUsbInterface = microUsbInterface; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Adapter/AndroidCharger.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Adapter; 2 | 3 | /** 4 | * Created by hollis on 16/5/10. 5 | * 安卓设备的充电器 6 | */ 7 | public class AndroidCharger implements MicroUsbInterface { 8 | @Override 9 | public void chargeWithMicroUsb() { 10 | System.out.println("使用MicroUsb型号的充电器充电..."); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Adapter/AppleCharger.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Adapter; 2 | 3 | /** 4 | * Created by hollis on 16/5/10. 5 | * 苹果设备的充电器 6 | */ 7 | public class AppleCharger implements LightningInterface { 8 | @Override 9 | public void chargeWithLightning() { 10 | System.out.println("使用Lightning型号的充电器充电..."); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Adapter/GalaxyS7.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Adapter; 2 | 3 | /** 4 | * Created by hollis on 16/5/10. 5 | */ 6 | public class GalaxyS7 { 7 | 8 | private MicroUsbInterface microUsbInterface; 9 | 10 | public GalaxyS7() { 11 | } 12 | 13 | public GalaxyS7(MicroUsbInterface microUsbInterface) { 14 | this.microUsbInterface = microUsbInterface; 15 | } 16 | 17 | public void charge(){ 18 | System.out.println("开始给我的GalaxyS7手机充电..."); 19 | microUsbInterface.chargeWithMicroUsb(); 20 | System.out.println("开始给我的GalaxyS7手机充电..."); 21 | } 22 | 23 | public MicroUsbInterface getMicroUsbInterface() { 24 | return microUsbInterface; 25 | } 26 | 27 | public void setMicroUsbInterface(MicroUsbInterface microUsbInterface) { 28 | this.microUsbInterface = microUsbInterface; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Adapter/Iphone6Plus.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Adapter; 2 | 3 | /** 4 | * Created by hollis on 16/5/10. 5 | */ 6 | public class Iphone6Plus { 7 | 8 | private LightningInterface lightningInterface; 9 | 10 | public Iphone6Plus() { 11 | } 12 | 13 | public Iphone6Plus(LightningInterface lightningInterface) { 14 | this.lightningInterface = lightningInterface; 15 | } 16 | 17 | public void charge() { 18 | System.out.println("开始给我的Iphone6Plus手机充电..."); 19 | lightningInterface.chargeWithLightning(); 20 | System.out.println("结束给我的Iphone6Plus手机充电..."); 21 | } 22 | 23 | public LightningInterface getLightningInterface() { 24 | return lightningInterface; 25 | } 26 | 27 | public void setLightningInterface(LightningInterface lightningInterface) { 28 | this.lightningInterface = lightningInterface; 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Adapter/LightningInterface.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Adapter; 2 | 3 | /** 4 | * Created by hollis on 16/5/10. 5 | * Lightning充电器接口 6 | */ 7 | public interface LightningInterface { 8 | public void chargeWithLightning(); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Adapter/Main.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Adapter; 2 | 3 | /** 4 | * Created by hollis on 16/5/10. 5 | */ 6 | public class Main { 7 | 8 | public static void main(String[] args) { 9 | Iphone6Plus iphone6Plus = new Iphone6Plus(new AppleCharger()); 10 | iphone6Plus.charge(); 11 | 12 | System.out.println("=============================="); 13 | 14 | GalaxyS7 galaxyS7 = new GalaxyS7(new AndroidCharger()); 15 | galaxyS7.charge(); 16 | 17 | System.out.println("=============================="); 18 | 19 | Adapter adapter = new Adapter(new AndroidCharger()); 20 | Iphone6Plus newIphone = new Iphone6Plus(); 21 | newIphone.setLightningInterface(adapter); 22 | newIphone.charge(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Adapter/MicroUsbInterface.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Adapter; 2 | 3 | /** 4 | * Created by hollis on 16/5/10. 5 | * MicroUsb充电器接口 6 | */ 7 | public interface MicroUsbInterface { 8 | public void chargeWithMicroUsb(); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Builder/Builder.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Builder; 2 | 3 | /** 4 | * Created by hollis on 16/5/3. 5 | */ 6 | public abstract class Builder { 7 | 8 | protected Role role = new Role(); 9 | 10 | public abstract void buildHead(); 11 | 12 | public abstract void buildFace(); 13 | 14 | public abstract void buildBody(); 15 | 16 | public abstract void buildHp(); 17 | 18 | public abstract void buildSp(); 19 | 20 | public abstract void buildMp(); 21 | 22 | public Role getResult() { 23 | return role; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Builder/CommonRoleBuilder.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Builder; 2 | 3 | /** 4 | * Created by hollis on 16/5/3. 5 | */ 6 | public class CommonRoleBuilder extends Builder { 7 | 8 | private Role role = new Role(); 9 | 10 | @Override 11 | public void buildHead() { 12 | role.setBody("common head"); 13 | } 14 | 15 | @Override 16 | public void buildFace() { 17 | role.setFace("common face"); 18 | } 19 | 20 | @Override 21 | public void buildBody() { 22 | role.setBody("common body"); 23 | } 24 | 25 | @Override 26 | public void buildHp() { 27 | role.setHp(100d); 28 | } 29 | 30 | @Override 31 | public void buildSp() { 32 | role.setSp(100d); 33 | } 34 | 35 | @Override 36 | public void buildMp() { 37 | role.setMp(100d); 38 | } 39 | 40 | @Override 41 | public Role getResult() { 42 | return role; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Builder/Director.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Builder; 2 | 3 | /** 4 | * Created by hollis on 16/5/3. 5 | */ 6 | public class Director { 7 | 8 | public void construct(Builder builder){ 9 | builder.buildBody(); 10 | builder.buildHead(); 11 | builder.buildFace(); 12 | builder.buildHp(); 13 | builder.buildMp(); 14 | builder.buildSp(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Builder/Main.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Builder; 2 | 3 | /** 4 | * Created by hollis on 16/5/3. 5 | */ 6 | public class Main { 7 | 8 | public static void main(String[] args) { 9 | 10 | Director director = new Director(); 11 | Builder commonBuilder = new CommonRoleBuilder(); 12 | 13 | director.construct(commonBuilder); 14 | Role commonRole = commonBuilder.getResult(); 15 | System.out.println(commonRole); 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Builder/Role.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Builder; 2 | 3 | /** 4 | * Created by hollis on 16/5/3. 5 | */ 6 | public class Role { 7 | 8 | private String head; //头部 9 | private String face; //脸部(脸部依赖于头部) 10 | private String body; //身体 11 | private Double hp; //生命值 12 | private Double sp; //能量值 13 | private Double mp; //魔法值 14 | 15 | 16 | public String getHead() { 17 | return head; 18 | } 19 | 20 | public void setHead(String head) { 21 | this.head = head; 22 | } 23 | 24 | public String getFace() { 25 | return face; 26 | } 27 | 28 | public void setFace(String face) { 29 | this.face = face; 30 | } 31 | 32 | public String getBody() { 33 | return body; 34 | } 35 | 36 | public void setBody(String body) { 37 | this.body = body; 38 | } 39 | 40 | public Double getHp() { 41 | return hp; 42 | } 43 | 44 | public void setHp(Double hp) { 45 | this.hp = hp; 46 | } 47 | 48 | public Double getSp() { 49 | return sp; 50 | } 51 | 52 | public void setSp(Double sp) { 53 | this.sp = sp; 54 | } 55 | 56 | public Double getMp() { 57 | return mp; 58 | } 59 | 60 | public void setMp(Double mp) { 61 | this.mp = mp; 62 | } 63 | 64 | @Override 65 | public String toString() { 66 | return "Role{" + 67 | "head='" + head + '\'' + 68 | ", face='" + face + '\'' + 69 | ", body='" + body + '\'' + 70 | ", hp=" + hp + 71 | ", sp=" + sp + 72 | ", mp=" + mp + 73 | '}'; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Builder/SuperRoleBuilder.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Builder; 2 | 3 | /** 4 | * Created by hollis on 16/5/3. 5 | */ 6 | public class SuperRoleBuilder extends Builder { 7 | 8 | private Role role = new Role(); 9 | 10 | @Override 11 | public void buildHead() { 12 | role.setBody("suoer head"); 13 | } 14 | 15 | @Override 16 | public void buildFace() { 17 | role.setFace("super face"); 18 | } 19 | 20 | @Override 21 | public void buildBody() { 22 | role.setBody("super body"); 23 | } 24 | 25 | @Override 26 | public void buildHp() { 27 | role.setHp(120d); 28 | } 29 | 30 | @Override 31 | public void buildSp() { 32 | role.setSp(120d); 33 | } 34 | 35 | @Override 36 | public void buildMp() { 37 | role.setMp(120d); 38 | } 39 | 40 | @Override 41 | public Role getResult() { 42 | return role; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/FactoryMethod/Operation.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.FactoryMethod; 2 | 3 | /** 4 | * Created by hollis on 16/4/11. 5 | */ 6 | public abstract class Operation { 7 | 8 | private double value1 = 0; 9 | private double value2 = 0; 10 | 11 | public double getValue1() { 12 | return value1; 13 | } 14 | 15 | public void setValue1(double value1) { 16 | this.value1 = value1; 17 | } 18 | 19 | public double getValue2() { 20 | return value2; 21 | } 22 | 23 | public void setValue2(double value2) { 24 | this.value2 = value2; 25 | } 26 | 27 | public abstract double getResult(); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/FactoryMethod/OperationAdd.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.FactoryMethod; 2 | 3 | /** 4 | * Created by hollis on 16/4/11. 5 | */ 6 | public class OperationAdd extends Operation { 7 | 8 | @Override 9 | public double getResult() { 10 | return getValue1() + getValue2(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/FactoryMethod/OperationDiv.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.FactoryMethod; 2 | 3 | /** 4 | * Created by hollis on 16/4/11. 5 | */ 6 | public class OperationDiv extends Operation { 7 | 8 | @Override 9 | public double getResult() { 10 | if (getValue2() != 0) { 11 | return getValue1() / getValue2(); 12 | } 13 | throw new IllegalArgumentException("除数不能为零"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/FactoryMethod/OperationMul.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.FactoryMethod; 2 | 3 | /** 4 | * Created by hollis on 16/4/11. 5 | */ 6 | public class OperationMul extends Operation { 7 | 8 | @Override 9 | public double getResult() { 10 | return getValue1() * getValue2(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/FactoryMethod/OperationSub.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.FactoryMethod; 2 | 3 | 4 | /** 5 | * Created by hollis on 16/4/11. 6 | */ 7 | public class OperationSub extends Operation { 8 | 9 | @Override 10 | public double getResult() { 11 | return getValue1() - getValue2(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/FactoryMethod/client/Main.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.FactoryMethod.client; 2 | 3 | import com.hollischuang.pattern.FactoryMethod.Operation; 4 | import com.hollischuang.pattern.FactoryMethod.factory.AddFactory; 5 | import com.hollischuang.pattern.FactoryMethod.factory.IFactory; 6 | 7 | /** 8 | * Created by hollis on 16/4/12. 9 | */ 10 | public class Main { 11 | 12 | public static void main(String[] args) { 13 | IFactory factory = new AddFactory(); 14 | Operation operationAdd = factory.CreateOption(); 15 | operationAdd.setValue1(10); 16 | operationAdd.setValue2(5); 17 | System.out.println(operationAdd.getResult()); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/FactoryMethod/factory/AddFactory.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.FactoryMethod.factory; 2 | 3 | import com.hollischuang.pattern.FactoryMethod.Operation; 4 | import com.hollischuang.pattern.FactoryMethod.OperationAdd; 5 | 6 | /** 7 | * Created by hollis on 16/4/12. 8 | * 加法类工厂 9 | */ 10 | public class AddFactory implements IFactory { 11 | 12 | public Operation CreateOption() { 13 | return new OperationAdd(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/FactoryMethod/factory/DivFactory.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.FactoryMethod.factory; 2 | 3 | import com.hollischuang.pattern.FactoryMethod.Operation; 4 | import com.hollischuang.pattern.FactoryMethod.OperationDiv; 5 | 6 | /** 7 | * Created by hollis on 16/4/12. 8 | * 除法类工厂 9 | */ 10 | public class DivFactory implements IFactory { 11 | 12 | public Operation CreateOption() { 13 | return new OperationDiv(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/FactoryMethod/factory/IFactory.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.FactoryMethod.factory; 2 | 3 | import com.hollischuang.pattern.FactoryMethod.Operation; 4 | 5 | /** 6 | * Created by hollis on 16/4/12. 7 | * 工厂接口 8 | */ 9 | public interface IFactory { 10 | Operation CreateOption(); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/FactoryMethod/factory/MulFactory.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.FactoryMethod.factory; 2 | 3 | import com.hollischuang.pattern.FactoryMethod.Operation; 4 | import com.hollischuang.pattern.FactoryMethod.OperationMul; 5 | 6 | /** 7 | * Created by hollis on 16/4/12. 8 | * 除法类工厂 9 | */ 10 | public class MulFactory implements IFactory { 11 | 12 | public Operation CreateOption() { 13 | return new OperationMul(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/FactoryMethod/factory/SubFactory.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.FactoryMethod.factory; 2 | 3 | import com.hollischuang.pattern.FactoryMethod.Operation; 4 | import com.hollischuang.pattern.FactoryMethod.OperationSub; 5 | 6 | /** 7 | * Created by hollis on 16/4/12. 8 | * 减法类工厂 9 | */ 10 | public class SubFactory implements IFactory { 11 | 12 | public Operation CreateOption() { 13 | return new OperationSub(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Iterator/ChineseFoodMenu.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Iterator; 2 | 3 | /** 4 | * Created by hollis on 17/2/18. 5 | */ 6 | public class ChineseFoodMenu implements Menu { 7 | 8 | private String[] foods = new String[4]; 9 | private int position = 0; 10 | 11 | @Override 12 | public void add(String name) { 13 | foods[position] = name; 14 | position += 1; 15 | } 16 | 17 | @Override 18 | public Iterator getIterator() { 19 | return new MenuIterator(this.foods); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Iterator/Iterator.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Iterator; 2 | 3 | /** 4 | * Created by hollis on 17/2/18. 5 | */ 6 | public interface Iterator { 7 | 8 | boolean hasNext(); 9 | 10 | E next(); 11 | 12 | default void remove() { 13 | throw new UnsupportedOperationException("remove"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Iterator/Main.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Iterator; 2 | 3 | /** 4 | * Created by hollis on 17/2/18. 5 | */ 6 | public class Main { 7 | 8 | public static void main(String[] args) { 9 | ChineseFoodMenu chineseFoodMenu = new ChineseFoodMenu(); 10 | chineseFoodMenu.add("宫保鸡丁"); 11 | chineseFoodMenu.add("孜然羊肉"); 12 | chineseFoodMenu.add("水煮鱼"); 13 | chineseFoodMenu.add("北京烤鸭"); 14 | 15 | Iterator iterator = chineseFoodMenu.getIterator(); 16 | while (iterator.hasNext()) { 17 | System.out.println(iterator.next()); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Iterator/Menu.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Iterator; 2 | 3 | /** 4 | * Created by hollis on 17/2/18. 5 | */ 6 | public interface Menu { 7 | 8 | void add(String name); 9 | 10 | Iterator getIterator(); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Iterator/MenuIterator.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Iterator; 2 | 3 | /** 4 | * Created by hollis on 17/2/18. 5 | */ 6 | public class MenuIterator implements Iterator { 7 | 8 | String[] foods; 9 | int position = 0; 10 | 11 | public MenuIterator(String[] foods){ 12 | this.foods = foods; 13 | } 14 | 15 | @Override 16 | public boolean hasNext() { 17 | 18 | return position != foods.length; 19 | } 20 | 21 | @Override 22 | public Object next() { 23 | String food = foods[position]; 24 | position += 1; 25 | return food; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Singlenton/Enum/Singleton.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Singlenton.Enum; 2 | 3 | /** 4 | * Created by hollis on 16/4/6. 5 | */ 6 | public enum Singleton { 7 | 8 | INSTANCE; 9 | 10 | Singleton() { 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Singlenton/Serializable/Singleton.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Singlenton.Serializable; 2 | 3 | /** 4 | * Created by hollis on 16/4/6. 5 | * 不会被序列化破坏的单例 6 | */ 7 | public class Singleton { 8 | 9 | private volatile static Singleton singleton; 10 | private Singleton (){} 11 | public static Singleton getSingleton() { 12 | if (singleton == null) { 13 | synchronized (Singleton.class) { 14 | if (singleton == null) { 15 | singleton = new Singleton(); 16 | } 17 | } 18 | } 19 | return singleton; 20 | } 21 | 22 | private Object readResolve() { 23 | return singleton; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Singlenton/client/SingletonClient.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Singlenton.client; 2 | 3 | import com.hollischuang.pattern.Singlenton.hangry.Singleton; 4 | 5 | /** 6 | * Created by hollis on 16/4/6. 7 | */ 8 | public class SingletonClient { 9 | 10 | public static void main(String[] args) { 11 | Singleton singleton1 = Singleton.getInstance(); 12 | Singleton singleton2 = Singleton.getInstance(); 13 | System.out.println(singleton1 == singleton2); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Singlenton/double_check/FinalSingleton.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Singlenton.double_check; 2 | 3 | /** 4 | * Created by hollis on 16/4/6. 5 | */ 6 | class FinalWrapper { 7 | public final T value; 8 | 9 | public FinalWrapper(T value) { 10 | this.value = value; 11 | } 12 | } 13 | 14 | public class FinalSingleton { 15 | private FinalWrapper helperWrapper = null; 16 | 17 | public FinalSingleton getHelper() { 18 | FinalWrapper wrapper = helperWrapper; 19 | 20 | if (wrapper == null) { 21 | synchronized (this) { 22 | if (helperWrapper == null) { 23 | helperWrapper = new FinalWrapper(new FinalSingleton()); 24 | } 25 | wrapper = helperWrapper; 26 | } 27 | } 28 | return wrapper.value; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Singlenton/double_check/Singleton.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Singlenton.double_check; 2 | 3 | /** 4 | * Created by hollis on 16/4/6. 5 | * 双重校验锁,有可见性问题 6 | */ 7 | public class Singleton { 8 | 9 | private static Singleton singleton; 10 | 11 | private Singleton() { 12 | } 13 | 14 | public static Singleton getSingleton() { 15 | if (singleton == null) { 16 | synchronized (Singleton.class) { 17 | if (singleton == null) { 18 | singleton = new Singleton(); 19 | } 20 | } 21 | } 22 | return singleton; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Singlenton/double_check/VolatileSingleton.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Singlenton.double_check; 2 | 3 | /** 4 | * Created by hollis on 16/4/6. 5 | */ 6 | public class VolatileSingleton { 7 | private static volatile VolatileSingleton singleton; 8 | 9 | private VolatileSingleton() { 10 | } 11 | 12 | public static VolatileSingleton getSingleton() { 13 | if (singleton == null) { 14 | synchronized (VolatileSingleton.class) { 15 | if (singleton == null) { 16 | singleton = new VolatileSingleton(); 17 | } 18 | } 19 | } 20 | return singleton; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Singlenton/hangry/Singleton.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Singlenton.hangry; 2 | 3 | /** 4 | * Created by hollis on 16/4/6. 5 | * 饿汉模式 6 | */ 7 | public class Singleton { 8 | //在类内部实例化一个实例 9 | private static Singleton instance = new Singleton(); 10 | //私有的构造函数,外部无法访问 11 | private Singleton() { 12 | } 13 | //对外提供获取实例的静态方法 14 | public static Singleton getInstance() { 15 | return instance; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Singlenton/hangry/Singleton2.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Singlenton.hangry; 2 | 3 | /** 4 | * Created by hollis on 16/4/6. 5 | * 饿汉模式变种 6 | */ 7 | public class Singleton2 { 8 | //在类内部定义 9 | private static Singleton2 instance; 10 | static { 11 | //实例化该实例 12 | instance = new Singleton2(); 13 | } 14 | //私有的构造函数,外部无法访问 15 | private Singleton2() { 16 | } 17 | //对外提供获取实例的静态方法 18 | public static Singleton2 getInstance() { 19 | return instance; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Singlenton/lazy/Singleton.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Singlenton.lazy; 2 | 3 | /** 4 | * Created by hollis on 16/4/6. 5 | * 懒汉模式,非线程安全 6 | */ 7 | public class Singleton { 8 | //定义实例 9 | private static Singleton instance; 10 | //私有构造方法 11 | private Singleton(){} 12 | //对外提供获取实例的静态方法 13 | public static Singleton getInstance() { 14 | //在对象被使用的时候才实例化 15 | if (instance == null) { 16 | instance = new Singleton(); 17 | } 18 | return instance; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Singlenton/lazy/StaticInnerClassSingleton.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Singlenton.lazy; 2 | 3 | /** 4 | * Created by hollis on 16/4/6. 5 | * 使用静态内部类实现延迟初始化 6 | */ 7 | public class StaticInnerClassSingleton { 8 | //在静态内部类中初始化实例对象 9 | private static class SingletonHolder { 10 | private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton(); 11 | } 12 | //私有的构造方法 13 | private StaticInnerClassSingleton() { 14 | } 15 | //对外提供获取实例的静态方法 16 | public static final StaticInnerClassSingleton getInstance() { 17 | return SingletonHolder.INSTANCE; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Singlenton/lazy/SynchronizedSingleton.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.Singlenton.lazy; 2 | 3 | /** 4 | * Created by hollis on 16/4/6. 5 | * 懒汉模式,线程安全 6 | */ 7 | public class SynchronizedSingleton { 8 | //定义实例 9 | private static SynchronizedSingleton instance; 10 | //私有构造方法 11 | private SynchronizedSingleton(){} 12 | //对外提供获取实例的静态方法,对该方法加锁 13 | public static synchronized SynchronizedSingleton getInstance() { 14 | //在对象被使用的时候才实例化 15 | if (instance == null) { 16 | instance = new SynchronizedSingleton(); 17 | } 18 | return instance; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/StaticFactory/Main.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.StaticFactory; 2 | 3 | import com.hollischuang.pattern.StaticFactory.Operation; 4 | import com.hollischuang.pattern.StaticFactory.OperationFactory; 5 | 6 | /** 7 | * Created by hollis on 16/4/11. 8 | */ 9 | public class Main { 10 | 11 | public static void main(String[] args) { 12 | // OperationAdd operationAdd = new OperationAdd(); 13 | // operationAdd.setValue1(10); 14 | // operationAdd.setValue2(5); 15 | // System.out.println(operationAdd.getResult()); 16 | 17 | 18 | Operation operationAdd = OperationFactory.createOperation("+"); 19 | operationAdd.setValue1(10); 20 | operationAdd.setValue2(5); 21 | System.out.println(operationAdd.getResult()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Strategy/AdvancedMember.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hollischuang/DesignPattern/8561d97d9a8142a79f609ac33db129d2d35fb836/src/main/java/com/hollischuang/pattern/Strategy/AdvancedMember.java -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Strategy/BookStore.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hollischuang/DesignPattern/8561d97d9a8142a79f609ac33db129d2d35fb836/src/main/java/com/hollischuang/pattern/Strategy/BookStore.java -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Strategy/Cashier.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hollischuang/DesignPattern/8561d97d9a8142a79f609ac33db129d2d35fb836/src/main/java/com/hollischuang/pattern/Strategy/Cashier.java -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Strategy/IntermediateMember.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hollischuang/DesignPattern/8561d97d9a8142a79f609ac33db129d2d35fb836/src/main/java/com/hollischuang/pattern/Strategy/IntermediateMember.java -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Strategy/Member.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hollischuang/DesignPattern/8561d97d9a8142a79f609ac33db129d2d35fb836/src/main/java/com/hollischuang/pattern/Strategy/Member.java -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/Strategy/PrimaryMember.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hollischuang/DesignPattern/8561d97d9a8142a79f609ac33db129d2d35fb836/src/main/java/com/hollischuang/pattern/Strategy/PrimaryMember.java -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/staticfactory/Operation.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.StaticFactory; 2 | 3 | /** 4 | * Created by hollis on 16/4/11. 5 | */ 6 | public abstract class Operation { 7 | 8 | private double value1 = 0; 9 | private double value2 = 0; 10 | 11 | public double getValue1() { 12 | return value1; 13 | } 14 | 15 | public void setValue1(double value1) { 16 | this.value1 = value1; 17 | } 18 | 19 | public double getValue2() { 20 | return value2; 21 | } 22 | 23 | public void setValue2(double value2) { 24 | this.value2 = value2; 25 | } 26 | 27 | public abstract double getResult(); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/staticfactory/OperationAdd.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.StaticFactory; 2 | 3 | /** 4 | * Created by hollis on 16/4/11. 5 | */ 6 | public class OperationAdd extends Operation { 7 | 8 | @Override 9 | public double getResult() { 10 | return getValue1() + getValue2(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/staticfactory/OperationDiv.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.StaticFactory; 2 | 3 | /** 4 | * Created by hollis on 16/4/11. 5 | */ 6 | public class OperationDiv extends Operation { 7 | 8 | @Override 9 | public double getResult() { 10 | if (getValue2() != 0) { 11 | return getValue1() / getValue2(); 12 | } 13 | throw new IllegalArgumentException("除数不能为零"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/staticfactory/OperationFactory.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.StaticFactory; 2 | 3 | /** 4 | * Created by hollis on 16/4/11. 5 | */ 6 | public class OperationFactory { 7 | 8 | public static Operation createOperation(String operation) { 9 | Operation oper = null; 10 | switch (operation) { 11 | 12 | case "+": 13 | oper = new OperationAdd(); 14 | break; 15 | 16 | case "-": 17 | oper = new OperationSub(); 18 | break; 19 | 20 | case "*": 21 | oper = new OperationMul(); 22 | break; 23 | 24 | case "/": 25 | oper = new OperationDiv(); 26 | break; 27 | default: 28 | throw new UnsupportedOperationException("不支持该操作"); 29 | } 30 | return oper; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/staticfactory/OperationMul.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.StaticFactory; 2 | 3 | /** 4 | * Created by hollis on 16/4/11. 5 | */ 6 | public class OperationMul extends Operation { 7 | 8 | @Override 9 | public double getResult() { 10 | return getValue1() * getValue2(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/hollischuang/pattern/staticfactory/OperationSub.java: -------------------------------------------------------------------------------- 1 | package com.hollischuang.pattern.StaticFactory; 2 | 3 | /** 4 | * Created by hollis on 16/4/11. 5 | */ 6 | public class OperationSub extends Operation { 7 | 8 | @Override 9 | public double getResult() { 10 | return getValue1() - getValue2(); 11 | } 12 | } 13 | --------------------------------------------------------------------------------