java中常用的5种设计模式
背景
虽然Java 的设计模式有20多种,但是我们基本上都是用spring体系开发的,所以只推荐一下这5种设计模式,基本上能解决大部分问题。
常用的5种设计模式
一、单例模式
定义: 这个类的实例在这个项目中只能有一个。
代码:
// 全局本地缓存
public class Cache {private static final Cache<CacheKey, Object> cache = new Cache<>(); public static Cache<CacheKey, Object> getInstance(){return cache;}
}
// 全局的线程池,提供给多个场景复用
public class ExecutorServiceManager {private final static LinkedBlockingQueue<Runnable> WORK_QUEUE = new LinkedBlockingQueue<>(1000);private final static RejectedExecutionHandler HANDLER = new ThreadPoolExecutor.CallerRunsPolicy();private static ThreadPoolExecutor executorService = new ThreadPoolExecutor(20, 100, 0, TimeUnit.SECONDS, WORK_QUEUE, HANDLER);public static ThreadPoolExecutor getThreadPoolInstance(){return executorService;}// 关闭线程池public static void shutdown() {if (executorService != null && !executorService.isShutdown()) {executorService.shutdown();}}// 强制关闭线程池public static void shutdownNow() {if (executorService != null && !executorService.isShutdown()) {executorService.shutdownNow();}}
}
二、工厂模式
定义:推荐两种,分别是简单工厂模式、抽象工厂模式。
代码:
// 简单工厂模式
@Component
public class OrderFactory {@Autowiredprivate List<Order> orderList;public Order createOrderBean(BizTypeEnum type) throws Exception {return orderList.stream().filter(x -> x.symbol() == type).findFirst().orElseThrow(() -> new Exception("参数有误"));}
}// 抽象工厂模式
public abstract class AbstractFactory<E extends Enum<E>, S extends BeanInterface<E>> {protected List<S> ss;public AbstractFactory(List<S> ss) {this.ss = ss;}/*** 创建bean** @param en 枚举* @return 符合条件的bean*/public Optional<S> createBean(E en) {return ss.stream().filter(x -> x.symbol().equals(en)).findFirst();}}public interface BeanInterface<E extends Enum<E>> {/*** 具体实例的标识** @return*/E symbol();}
三、适配器模式
这个模式,简单说就是想使用别的类的功能。细分为三种,类的适配器模式、对象的适配器模式、接口的适配器模式,但是类的适配器模式不推荐(基于继承),所以下面就介绍下,对象的适配器模式和接口的适配器模式。
对象的适配器模式:就是通过组合的方式拥有某个对象的能力;
接口的适配器模式:就是抽象的形式,空实现,给子类足够的选择。
对象的适配器模式代码:
@Data
public final class RecoveryUserModelAdapter {private UserModel userModel;public List<String> getCompany() {return userModel.getCompany();}public String getAccount(){return userModel.getAccount();}public String getName(){return userModel.getName();}public RecoveryUserModelAdapter(UserModel userModel) {this.userModel = userModel;}/*** 角色key*/private Set<String> roleKeys;public boolean hasSuperRole() {return roleKeys != null&& (roleKeys.contains(RecoveryConstants.SUPER_ROLE)|| roleKeys.contains(RecoveryConstants.MANAGE_ROLE)|| roleKeys.contains(RecoveryConstants.ADMIN));}public boolean hasManageRole() {return roleKeys != null&& (roleKeys.contains(RecoveryConstants.MANAGE_ROLE)|| roleKeys.contains(RecoveryConstants.ADMIN));}}
接口的适配器模式代码:
public interface Order {public Object create(Object params);public void check(Object params);public BizTypeEnum symbol();
}public abstract class AbstractOrder implements Order {@Overridepublic Object create(Object params) {return null;}@Overridepublic void check(Object params) {}
}
四、模版方法模式
定义:一个方法定义好执行步骤,每个步骤子类可以按照自己的需要实现对应的方法。
代码:
public abstract class AbstractOrder implements Order {@Overridepublic Object create(Object params) {// 1.校验参数checkParam(params);// 2.价格确认priceConfirm(params);// 3.构建数据buildOrderData(params);// 4.下单uniOrder(params);// 5.入库saveData(params);return null;}protected abstract void saveData(Object params);protected abstract void uniOrder(Object params);protected abstract void buildOrderData(Object params);protected abstract void priceConfirm(Object params);protected abstract void checkParam(Object params);protected void check(Object params) {}
}
五、策略模式
定义:一个方法多种实现,根据需要选择对应的实现,可以配合上面的几种模式使用
代码:
@Component
public class AppOrderStrategy implements Order{@Overridepublic Object create(Object params) {return null;}@Overridepublic BizTypeEnum symbol() {return BizTypeEnum.APP;}
}
@Component
public class MiniAppOrderStrategy implements Order{@Overridepublic Object create(Object params) {return null;}@Overridepublic BizTypeEnum symbol() {return BizTypeEnum.MINI_APP;}
}
@Component
public class H5OrderStrategy implements Order{@Overridepublic Object create(Object params) {return null;}@Overridepublic BizTypeEnum symbol() {return BizTypeEnum.H5;}
}