SpringBoot 之简单工厂模式
简单工厂: 工厂类根据传入的参数类型,动态决定创建哪一个产品了(实现类都继承同一个父类或接口)。在Spring中,我们只要将要用到的支付方式注入到容器中,我们便可以根据bean到名字去容器中获取。
首先创建一个父类或者接口。
public interface Animal {
void say();
}
创建多个产品类去实现同一个父类或接口
@Service
public class Dog implements Animal
{
@Override
public void say() {
System.out.println("DogDogDog");
}
}
@Service
public class Cat implements Animal
{
@Override
public void say() {
System.out.println("CatCatCat");
}
}
@Service
public class Pig implements Animal
{
@Override
public void say() {
System.out.println("PigPigPig");
}
}
方法一:在spring中共通过beanName去获取对应的实体
@SpringBootApplication
public class SpringBootSimpleFactoryApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SpringBootSimpleFactoryApplication.class, args);
//这里由于@Service注解默认会将类首字母小写注册到spring容器
Animal animal = (Animal) context.getBean("dog");
animal.say();
}
}
方法二:创建一个工厂,根据传入的信息,返回相应的实体
@Service
public class AnimalFactory {
@Autowired
private Dog dog;
@Autowired
private Cat cat;
@Autowired
private Pig pig;
public AmialMethod say(String type){
switch (type){
case "dog":
return dog;
case "cat":
return cat;
case "pig":
return pig;
default:
System.out.println("传入的参数没有对应的实体类");
}
return null;
}
}
@RestController
public class AnimalController {
@Autowired
private AnimalFactory animalFactory;
@RequestMapping("say")
public void pay(String type){
try {
Animal animal = animalFactory.say(type);
animal.say();
}catch (Exception e){
e.printStackTrace();
}
}
}