工厂设计模式

不要在业务代码中自己创建对象,用工厂类创建对象,目标就是解耦

  1. /**
  2. * 定义接口
  3. */
  4. interface Car {
  5. public void getCar();
  6. }
  7. /**
  8. * 定义子类实现接口
  9. */
  10. public class BMW implements Car{
  11. @Override
  12. public void getCar() {
  13. System.out.printf("来一辆BMW!");
  14. }
  15. }
  16. /**
  17. * 工厂类创建对象
  18. */
  19. public class CarFactor {
  20. public static Car carFactor(Class<?> tClass){
  21. return new BMW();
  22. }
  23. }
  24. /**
  25. * 运用工厂创建对象
  26. */
  27. public class testFactory {
  28. public static void main(String[] args) {
  29. Car car = CarFactor.carFactor(BYD.class);
  30. car.getCar();
  31. }
  32. }

策略设计模式

把业务代码中的if else替换,降低耦合,使业务代码变得优雅。

  1. /**
  2. * 定义接口
  3. */
  4. interface Car {
  5. public void getCar();
  6. }
  7. /**
  8. * 定义子类实现接口
  9. */
  10. public class BMW implements Car{
  11. @Override
  12. public void getCar() {
  13. System.out.printf("来一辆BMW!");
  14. }
  15. }
  16. /**
  17. * 定义子类实现接口
  18. */
  19. public class BYD implements Car {
  20. @Override
  21. public void getCar() {
  22. System.out.printf("来一辆BYD!");
  23. }
  24. }
  25. /**
  26. * 工厂类创建对象
  27. */
  28. public class CarFactor {
  29. public static Car carFactor(Class<?> tClass){
  30. if (tClass.getName().equals(BMW.class.getName())){
  31. return new BMW();
  32. }else
  33. if (tClass.getName().equals(BYD.class.getName())){
  34. return new BYD();
  35. }else
  36. return null;
  37. }
  38. }
  39. /**
  40. * 运用工厂创建对象
  41. */
  42. public class testFactory {
  43. public static void main(String[] args) {
  44. Car car = CarFactor.carFactor(BYD.class);
  45. car.getCar();
  46. }
  47. }

模板设计模式

  • 应用场景
    • 当子类中的方法有相同的执行逻辑,且子类的方法必须执行该逻辑,就可以用到模板设计模式(例如:当我们到ATM机上取钱,插卡,输入密码,取卡,这几个步骤是必不可少的,我们就可以把这几个步骤设计成模板,强制子类必须执行)。
  • 实现步骤
    • 定义一个接口,接口中定义一个方法;
    • 定义一个抽象类,实现这个接口并重写接口中的方法,在抽象类中定义插卡,输入密码,取卡的方法,而抽象类的子类只需要实现自己特有的方法就行。
  • demo实现 ```java public class BrandATM { public static void main(String[] args) { BrandMoBan brandMoBan = new QuQian(); brandMoBan.yeWu(); System.out.println(“==================”); BrandMoBan brandMoBan1 = new ChaXunYuE(); brandMoBan1.yeWu(); System.out.println(“==================”); BrandMoBan brandMoBan2 = new ChaXunAndQuQian(); brandMoBan2.yeWu(); } }

/**

  • 定义接口 */ interface BrandMoBan { void yeWu(); }

/**

  • 定义抽象类实现接口 */ abstract class AbstractBrandMoBan implements BrandMoBan { //业务流程方法 @Override public void yeWu() {

    1. this.chaKa();
    2. this.inputPassword();
    3. this.chaXunYuE();
    4. this.quQian();
    5. this.quKa();

    }

    /**

    • 查询余额 / protected abstract void chaXunYuE(); /*
    • 取钱 */ public abstract void quQian();

      /**

    • 取卡 / private final void quKa() { System.out.println(“取卡”); } /*
    • 输入密码 / public static final void inputPassword() { System.out.println(“输入密码!”); } /*
    • 插卡 */ private final void chaKa() { System.out.println(“插卡”); } }

/**

  • 只取钱
  • 重写父类所有抽象方法 */ class QuQian extends AbstractBrandMoBan { @Override protected void chaXunYuE() { } @Override public void quQian() {
    1. System.out.println("取钱");
    2. AbstractBrandMoBan.inputPassword();
    } }

/**

  • 只查询余额
  • 重写父类所有抽象方法 */ class ChaXunYuE extends AbstractBrandMoBan { @Override public void chaXunYuE() {

    1. System.out.println("查询余额");

    }

    @Override public void quQian() { } }

/**

  • 查询余额并取钱
  • 重写父类所有抽象方法 */ class ChaXunAndQuQian extends AbstractBrandMoBan { @Override public void chaXunYuE() {

    1. System.out.println("查询余额");

    }

    @Override public void quQian() {

    1. System.out.println("取钱");
    2. AbstractBrandMoBan.inputPassword();

    } }

执行结果: 插卡 输入密码! 取钱 输入密码!

  1. 取卡

================== 插卡 输入密码! 查询余额

  1. 取卡

================== 插卡 输入密码! 查询余额 取钱 输入密码! 取卡

  1. ```java
  2. public class DesignModeDemo {
  3. public static void main(String[] args) {
  4. doSortArray sortStrategy = SortStrategyFacotry.getSortStrategy(discount);
  5. sortStrategy.sort(arr);
  6. }
  7. public interface doSortArray {
  8. void sort(int [] arr);
  9. }
  10. public static abstract class AbstractSort implements doSortArray{
  11. //定义出来一套模板
  12. @Override
  13. public void sort(int[] arr) {
  14. //咱们先普通排序
  15. doCommentSort(arr);
  16. //咱们得特殊排序
  17. doSpeciaSort(arr);
  18. //再进行打印
  19. doCommentPrint(arr);
  20. }
  21. protected void doCommentPrint(int[] arr){
  22. System.out.println(Arrays.toString(arr));
  23. }
  24. protected abstract void doSpeciaSort(int[] arr);
  25. // 普通排序
  26. protected void doCommentSort(int[] arr){
  27. Arrays.sort(arr);
  28. }
  29. }
  30. /*
  31. 子类继承抽象类重写抽象方法,实现子类特有逻辑
  32. */
  33. public static class NomalSort extends AbstractSort{
  34. //普通排序由于父类已经把这个模板流程固定下来了,而且已经进行了排序
  35. @Override
  36. protected void doSpeciaSort(int[] arr) {
  37. // doNothing
  38. }
  39. }
  40. /*
  41. 子类继承抽象类重写抽象方法,实现子类特有逻辑
  42. 特殊排序
  43. */
  44. public static class SpeciaSort extends AbstractSort{
  45. @Override
  46. protected void doSpeciaSort(int[] arr) {
  47. //[1 ,2 ,3, 6, 7, 8, 9] source
  48. //[1, 3, 7, 9, 8, 6, 2] target
  49. int incrNum = 0;
  50. int lastNum = arr.length -1;
  51. int [] targetArr = new int[arr.length];
  52. for (int i = 0; i < arr.length; i++) {
  53. if(i % 2 ==0){
  54. // 第一位
  55. targetArr[incrNum] = arr[i];
  56. incrNum ++;
  57. }else{
  58. //第二位
  59. targetArr[lastNum] = arr[i];
  60. lastNum --;
  61. }
  62. }
  63. for (int i = 0; i < arr.length; i++) {
  64. arr[i] = targetArr[i];
  65. }
  66. }
  67. }
  68. /*
  69. 用工厂创建对象
  70. */
  71. public static class SortStrategyFacotry{
  72. public static doSortArray getSortStrategy(int discount){
  73. if(discount == 0){
  74. //普通排序
  75. return new NomalSort();
  76. }else{
  77. // 特殊排序
  78. return new SpeciaSort();
  79. }
  80. }
  81. }
  82. }

状态设计模式

构造器设计模式

命令设计模式

组合设计模式

装饰者设计模式

  • 作用:
    • 在不影响原始目标类的情况下,对原始目标类的功能进行增强 ```java
  1. // 接口
  2. public interface Component{
  3. void execute();
  4. }
  5. public static class ConcreateComponent implements Component{
  6. @Override
  7. public void execute() {
  8. System.out.println("我要吃饭");
  9. }
  10. }
  11. // 1、装饰类需要和原始目标类实现相同得接口
  12. // 2、装饰类要缓存原始目标类得 对象
  13. //装饰类 ---> 对原来的那个接口进行增强
  14. public static class Decorator implements Component{
  15. private ConcreateComponent concreateComponent;
  16. public Decorator(ConcreateComponent concreateComponent){
  17. this.concreateComponent = concreateComponent;
  18. }
  19. @Override
  20. public void execute() {
  21. System.out.println("吃饭之前洗洗手");
  22. concreateComponent.execute();
  23. System.out.println("吃完之后洗洗手");
  24. }
  25. }

public class WithDecoratorDesignMode2 { public static void main(String[] args) { Component component = new Decorator(new ConcreateComponent()); component.execute(); }

}

  1. <a name="fHLtJ"></a>
  2. ### 单例设计模式
  3. - 原理:一个对象在项目中只创建了一个
  4. - 使用场景:这个项目中有一个对象从始至终都是同一个,但这个对象我们又不想交给spring帮我们管理
  5. - 饿汉式:一上来就通过成员变量创建对象,把构造方法私有化,不让别人通过构造方法创建对象
  6. - 懒汉式:只有使用到的时候才创建对象,同样把构造方法私有化
  7. ```java
  8. public class SingletonDesignEH {
  9. //volatile避免指令重排问题
  10. private volatile static SingletonDesignEH singletonDesignEH;
  11. // 构造方法私有不让别人来创建我们的对象
  12. private SingletonDesignEH() {
  13. }
  14. //多线程下操作同一个成员变量会出现指令重排问题,需要给成员变量加上volatile
  15. //关键字避免指令重排问题
  16. public static SingletonDesignEH getSingletonDesignEH() {
  17. //提升性能,多线程下排队线程太多问题
  18. if (singletonDesignEH == null) {
  19. //解决多线程时线程安全问题
  20. synchronized (SingletonDesignEH.class) {
  21. //判断是否已经创建过这个对象
  22. if (singletonDesignEH == null) {
  23. singletonDesignEH = new SingletonDesignEH();
  24. return singletonDesignEH;
  25. }
  26. return singletonDesignEH;
  27. }
  28. }
  29. return singletonDesignEH;
  30. }
  31. }