public interface MyService {


   
String getType();


   
void checkStatus();

   
void inc();

   
Integer getCount();
}

 

 
 
public abstract class MyServiceCommon implements MyService {

   
private Integer count 0;

   
@Override
    public void
inc() {
       
count++;
    }

   
@Override
    public
Integer getCount() {
       
System.out.println("MVS : " + count);
       
return count;
    }

   
@Override
    public void
checkStatus() {
       
// Your code
   
}

}
 
@Component
public class
MyServiceOne extends MyServiceCommon {

   
@Override
    public
String getType() {
       
return "one";
    }

}
 
@Component
public class
MyServiceTwo extends MyServiceCommon {
   
@Override
    public
String getType() {
       
return "two";
    }


}
 

 

@Service
public class
MyServiceFactory {

   
@Autowired
    private
List<MyService> services;

   
private static final Map<String, MyService> myServiceCache = new HashMap<>();

   
@PostConstruct
    public void
initMyServiceCache() {
       
for(MyService service : services) {
           
myServiceCache.put(service.getType(), service);
        }
    }

   
public MyService getService(String type) {
       
MyService service = myServiceCache.get(type);
       
if(service == null) throw new RuntimeException("Unknown service type: " + type);
       
return service;
    }
}
 
 
 
@Component
public class
TestFactory2 implements CommandLineRunner {

   
@Autowired
   
MyServiceFactory myServiceFactory;

   
@Override
    public void
run(String... args) throws Exception {
       
MyService myServiceOne = myServiceFactory.getService("one");
       
myServiceOne.checkStatus();;
       
MyService myServiceTwo = myServiceFactory.getService("two");
       
myServiceTwo.checkStatus();
       
MyService myServiceThree = myServiceFactory.getService("one");
       
myServiceOne.inc();
       
myServiceOne.getCount();
       
myServiceThree.getCount();

    }
}
 
MVS : 1
MVS : 1