工厂设计模式
不要在业务代码中自己创建对象,用工厂类创建对象,目标就是解耦
/*** 定义接口*/interface Car {public void getCar();}/*** 定义子类实现接口*/public class BMW implements Car{@Overridepublic void getCar() {System.out.printf("来一辆BMW!");}}/*** 工厂类创建对象*/public class CarFactor {public static Car carFactor(Class<?> tClass){return new BMW();}}/*** 运用工厂创建对象*/public class testFactory {public static void main(String[] args) {Car car = CarFactor.carFactor(BYD.class);car.getCar();}}
策略设计模式
把业务代码中的if else替换,降低耦合,使业务代码变得优雅。
/*** 定义接口*/interface Car {public void getCar();}/*** 定义子类实现接口*/public class BMW implements Car{@Overridepublic void getCar() {System.out.printf("来一辆BMW!");}}/*** 定义子类实现接口*/public class BYD implements Car {@Overridepublic void getCar() {System.out.printf("来一辆BYD!");}}/*** 工厂类创建对象*/public class CarFactor {public static Car carFactor(Class<?> tClass){if (tClass.getName().equals(BMW.class.getName())){return new BMW();}elseif (tClass.getName().equals(BYD.class.getName())){return new BYD();}elsereturn null;}}/*** 运用工厂创建对象*/public class testFactory {public static void main(String[] args) {Car car = CarFactor.carFactor(BYD.class);car.getCar();}}
模板设计模式
- 应用场景
- 当子类中的方法有相同的执行逻辑,且子类的方法必须执行该逻辑,就可以用到模板设计模式(例如:当我们到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() {
this.chaKa();this.inputPassword();this.chaXunYuE();this.quQian();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() {
} }System.out.println("取钱");AbstractBrandMoBan.inputPassword();
/**
- 只查询余额
重写父类所有抽象方法 */ class ChaXunYuE extends AbstractBrandMoBan { @Override public void chaXunYuE() {
System.out.println("查询余额");
}
@Override public void quQian() { } }
/**
- 查询余额并取钱
重写父类所有抽象方法 */ class ChaXunAndQuQian extends AbstractBrandMoBan { @Override public void chaXunYuE() {
System.out.println("查询余额");
}
@Override public void quQian() {
System.out.println("取钱");AbstractBrandMoBan.inputPassword();
} }
执行结果: 插卡 输入密码! 取钱 输入密码!
取卡
================== 插卡 输入密码! 查询余额
取卡
================== 插卡 输入密码! 查询余额 取钱 输入密码! 取卡
```javapublic class DesignModeDemo {public static void main(String[] args) {doSortArray sortStrategy = SortStrategyFacotry.getSortStrategy(discount);sortStrategy.sort(arr);}public interface doSortArray {void sort(int [] arr);}public static abstract class AbstractSort implements doSortArray{//定义出来一套模板@Overridepublic void sort(int[] arr) {//咱们先普通排序doCommentSort(arr);//咱们得特殊排序doSpeciaSort(arr);//再进行打印doCommentPrint(arr);}protected void doCommentPrint(int[] arr){System.out.println(Arrays.toString(arr));}protected abstract void doSpeciaSort(int[] arr);// 普通排序protected void doCommentSort(int[] arr){Arrays.sort(arr);}}/*子类继承抽象类重写抽象方法,实现子类特有逻辑*/public static class NomalSort extends AbstractSort{//普通排序由于父类已经把这个模板流程固定下来了,而且已经进行了排序@Overrideprotected void doSpeciaSort(int[] arr) {// doNothing}}/*子类继承抽象类重写抽象方法,实现子类特有逻辑特殊排序*/public static class SpeciaSort extends AbstractSort{@Overrideprotected void doSpeciaSort(int[] arr) {//[1 ,2 ,3, 6, 7, 8, 9] source//[1, 3, 7, 9, 8, 6, 2] targetint incrNum = 0;int lastNum = arr.length -1;int [] targetArr = new int[arr.length];for (int i = 0; i < arr.length; i++) {if(i % 2 ==0){// 第一位targetArr[incrNum] = arr[i];incrNum ++;}else{//第二位targetArr[lastNum] = arr[i];lastNum --;}}for (int i = 0; i < arr.length; i++) {arr[i] = targetArr[i];}}}/*用工厂创建对象*/public static class SortStrategyFacotry{public static doSortArray getSortStrategy(int discount){if(discount == 0){//普通排序return new NomalSort();}else{// 特殊排序return new SpeciaSort();}}}}
状态设计模式
构造器设计模式
命令设计模式
组合设计模式
装饰者设计模式
- 作用:
- 在不影响原始目标类的情况下,对原始目标类的功能进行增强 ```java
// 接口public interface Component{void execute();}public static class ConcreateComponent implements Component{@Overridepublic void execute() {System.out.println("我要吃饭");}}// 1、装饰类需要和原始目标类实现相同得接口// 2、装饰类要缓存原始目标类得 对象//装饰类 ---> 对原来的那个接口进行增强public static class Decorator implements Component{private ConcreateComponent concreateComponent;public Decorator(ConcreateComponent concreateComponent){this.concreateComponent = concreateComponent;}@Overridepublic void execute() {System.out.println("吃饭之前洗洗手");concreateComponent.execute();System.out.println("吃完之后洗洗手");}}
public class WithDecoratorDesignMode2 { public static void main(String[] args) { Component component = new Decorator(new ConcreateComponent()); component.execute(); }
}
<a name="fHLtJ"></a>### 单例设计模式- 原理:一个对象在项目中只创建了一个- 使用场景:这个项目中有一个对象从始至终都是同一个,但这个对象我们又不想交给spring帮我们管理- 饿汉式:一上来就通过成员变量创建对象,把构造方法私有化,不让别人通过构造方法创建对象- 懒汉式:只有使用到的时候才创建对象,同样把构造方法私有化```javapublic class SingletonDesignEH {//volatile避免指令重排问题private volatile static SingletonDesignEH singletonDesignEH;// 构造方法私有不让别人来创建我们的对象private SingletonDesignEH() {}//多线程下操作同一个成员变量会出现指令重排问题,需要给成员变量加上volatile//关键字避免指令重排问题public static SingletonDesignEH getSingletonDesignEH() {//提升性能,多线程下排队线程太多问题if (singletonDesignEH == null) {//解决多线程时线程安全问题synchronized (SingletonDesignEH.class) {//判断是否已经创建过这个对象if (singletonDesignEH == null) {singletonDesignEH = new SingletonDesignEH();return singletonDesignEH;}return singletonDesignEH;}}return singletonDesignEH;}}
