工厂设计模式
不要在业务代码中自己创建对象,用工厂类创建对象,目标就是解耦
/**
* 定义接口
*/
interface Car {
public void getCar();
}
/**
* 定义子类实现接口
*/
public class BMW implements Car{
@Override
public 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{
@Override
public void getCar() {
System.out.printf("来一辆BMW!");
}
}
/**
* 定义子类实现接口
*/
public class BYD implements Car {
@Override
public 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();
}else
if (tClass.getName().equals(BYD.class.getName())){
return new BYD();
}else
return 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();
} }
执行结果: 插卡 输入密码! 取钱 输入密码!
取卡
================== 插卡 输入密码! 查询余额
取卡
================== 插卡 输入密码! 查询余额 取钱 输入密码! 取卡
```java
public 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{
//定义出来一套模板
@Override
public 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{
//普通排序由于父类已经把这个模板流程固定下来了,而且已经进行了排序
@Override
protected void doSpeciaSort(int[] arr) {
// doNothing
}
}
/*
子类继承抽象类重写抽象方法,实现子类特有逻辑
特殊排序
*/
public static class SpeciaSort extends AbstractSort{
@Override
protected void doSpeciaSort(int[] arr) {
//[1 ,2 ,3, 6, 7, 8, 9] source
//[1, 3, 7, 9, 8, 6, 2] target
int 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{
@Override
public void execute() {
System.out.println("我要吃饭");
}
}
// 1、装饰类需要和原始目标类实现相同得接口
// 2、装饰类要缓存原始目标类得 对象
//装饰类 ---> 对原来的那个接口进行增强
public static class Decorator implements Component{
private ConcreateComponent concreateComponent;
public Decorator(ConcreateComponent concreateComponent){
this.concreateComponent = concreateComponent;
}
@Override
public 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帮我们管理
- 饿汉式:一上来就通过成员变量创建对象,把构造方法私有化,不让别人通过构造方法创建对象
- 懒汉式:只有使用到的时候才创建对象,同样把构造方法私有化
```java
public 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;
}
}