设计模式 - 工厂模式 + 模板方法模式(消除if-else)

一、目的及参考

目的

提取重复代码,消除 if-else

参考

观看下文前请参考[设计模式-模板方法](https://blog.csdn.net/Moon_Light0/article/details/129954073?spm=1001.2014.3001.5501)

二、类图

在这里插入图片描述

三、代码

抽象模板类

public abstract class AbstractClass {

   //基本方法
   protected abstract void doSomething();

   //基本方法
   protected abstract void doAnything();

   //模板方法 抽取子类公共逻辑
   public void templateMethod(){

       System.out.println("实现子类公共逻辑");
       doSomething();
       doAnything();

    }

}

具体模板类

@Service("ConcreteLogicOne")
public class ConcreteLogicOne extends AbstractClass {
    @Override
    protected void doSomething() {
        System.out.println("ConcreteLogicOne逻辑处理1");
    }

    @Override
    protected void doAnything() {
        System.out.println("ConcreteLogicOne逻辑处理2");
    }
}
@Service("ConcreteLogicTwo")
public class ConcreteLogicTwo extends AbstractClass {
    @Override
    protected void doSomething() {
        System.out.println("ConcreteLogicTwo逻辑处理1");
    }

    @Override
    protected void doAnything() {
        System.out.println("ConcreteLogicTwo逻辑处理2");
    }
}

工具类

  • 用于获取注入的Bean
@Component
public class SpringBeanUtil  implements ApplicationContextAware {
	public static ApplicationContext applicationContext;

	public SpringBeanUtil() {
	}

	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		SpringBeanUtil.applicationContext = applicationContext;
	}

	public static void regBean(String name, Object object) {
		ConfigurableApplicationContext cc = (ConfigurableApplicationContext)applicationContext;
		DefaultListableBeanFactory cf = (DefaultListableBeanFactory)cc.getBeanFactory();
		cf.registerSingleton(name, object);
	}

	public static Object getBean(String name) {
		try {
			return applicationContext.getBean(name);
		} catch (Exception var2) {
			return null;
		}
	}

	public static <T> T getBean(Class<T> clazz) {
		try {
			return applicationContext.getBean(clazz);
		} catch (Exception var2) {
			return null;
		}
	}

	public static <T> T getBean(String name, Class<T> clazz) {
		try {
			applicationContext.getBeansOfType(clazz);
			return applicationContext.getBean(name, clazz);
		} catch (Exception var3) {
			return null;
		}
	}
}

场景类

@RestController
@RequestMapping("/dev-api/design-pattern")
public class TemplateMethodController {

    @GetMapping("/templateMethod")
    public void templateMethod(){
        AbstractClass concreteLogicOne = (AbstractClass)SpringBeanUtil.getBean("ConcreteLogicOne");
        AbstractClass ConcreteLogicTwo = (AbstractClass)SpringBeanUtil.getBean("ConcreteLogicTwo");
        //调用模板方法
        concreteLogicOne.templateMethod();
        ConcreteLogicTwo.templateMethod();
    }
}

结果:

在这里插入图片描述

四、总结

  • 我们在具体模板类上面加上了@Service(“ConcreteLogicOne”),这样类就被spring容器进行管理。
  • 通过applicationContext获取Bean名称,获取到对应具体模板类,这里就借助spring容器使用到了工厂模式
  • 工厂模式可以帮助我们消除if-else
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值