工厂模式+策略模式

本文介绍了如何在JavaSpring应用中,通过抽象接口和工厂模式,根据传入的PersonInputDto实例类型动态创建并执行查询。展示了两种工厂创建方法以及服务端如何通过依赖注入调用这些工厂。
摘要由CSDN通过智能技术生成

输入实体

基类

import lombok.Data;

@Data
public class PersonInputDto {
    private Integer id;
    private String name;
}

子类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ManPerson extends PersonInputDto {
    private String sex;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class WomenPerson extends PersonInputDto {
    private String sex;
}

创建抽象接口

接口

public interface Person {
    Object query(PersonInputDto inputDto);

    Integer getType();
}

抽象具体实现

@Component
public class ManHandle implements Person {
    @Override
    public Object query(PersonInputDto inputDto) {
        if (inputDto instanceof ManPerson) {
            ManPerson manPerson = (ManPerson) inputDto;
            manPerson.setId(1);
            manPerson.setSex("男");
            manPerson.setName("name1");
            return manPerson;
        }
        return null;
    }

    @Override
    public Integer getType() {
        return 1;
    }
}
@Component
public class WomenHandle implements Person {
    @Override
    public Object query(PersonInputDto inputDto) {
        if (inputDto instanceof WomenPerson) {
            WomenPerson womenPerson = (WomenPerson) inputDto;
            womenPerson.setId(2);
            womenPerson.setSex("女");
            womenPerson.setName("name2");
            return womenPerson;
        }
        return null;
    }

    @Override
    public Integer getType() {
        return 2;
    }
}

两种方式创建工厂

创建工厂1

import com.alibaba.fastjson.JSON;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

@Component
public class MainTestFactory implements ApplicationListener<ApplicationReadyEvent> {

    private static final Map<Integer, Person> handlerMap = new HashMap<>();

    public Person getAccountModel(Integer type) {
        return handlerMap.get(type);
    }

    @Override
    public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
        Collection<Person> values = applicationReadyEvent.getApplicationContext().getBeansOfType(Person.class).values();
        values.forEach(value -> handlerMap.put(value.getType(), value));
        System.out.println("handlerMap ===> " + JSON.toJSONString(handlerMap));
    }
}

创建工厂2

import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class MainTestFactory2 {

    @Resource
    private List<Person> personList;

    private static final Map<Integer, Person> handlerMap = new HashMap<>();

    public Person getAccountModel(Integer type) {
        return handlerMap.get(type);
    }


    @PostConstruct
    public void init() {
        personList.forEach(value -> handlerMap.put(value.getType(), value));
        System.out.println("handlerMap ===> " + JSON.toJSONString(handlerMap));
    }
}

服务调用

@RestController
@RequestMapping({"/", ""})
public class DemoController {

    @Resource
    private MainTestFactory factory;

    @Resource
    private MainTestFactory2 mainTestFactory2;


    @PostMapping("/test")
    @ResponseBody
    @ApiOperation("test")
    public String test() {
        ManPerson query = (ManPerson) factory.getAccountModel(1).query(new ManPerson());
        System.out.println(JSON.toJSONString(query));
        ManPerson query1 = (ManPerson) factory.getAccountModel(2).query(new ManPerson());
        System.out.println(query1);
        WomenPerson query2 = (WomenPerson) mainTestFactory2.getAccountModel(2).query(new WomenPerson());
        return JSON.toJSONString(query2);
    }


}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值