简单工厂模式
简单工厂就是创建一个工厂类,根据传入的参数类型来使用具体的产品;有多种机器人,比如阿里、小米的机器人,创建一个机器人共产,根据参数来区分具体使用的是那个机器人;然后调用具体的机器人;
场景A,场景B,每一个场景都可以选择机器人,这样的话就可以把场景的具体信息和机器人对应的参数保存到数据库中,这样我们可以通过数据库中的参数来自己区分,而机器人对应的类都会在启动的时候绑定自己的参数。
@Component
public class RobotFactory {
/**
* 机器人列表
*/
private static final Map<Integer, RobotService> ROBOT_SERVICE_MAP = new HashMap<>();
public String createRobot(Integer robotId){
return getRobot(robotId).sendMessage(robotId);
}
private RobotService getRobot(Integer robotBrandEnumSeq) {
return ROBOT_SERVICE_MAP.get(robotBrandEnumSeq);
}
public void putRobot(Integer robotBrandEnumSeq, RobotService robotService) {
ROBOT_SERVICE_MAP.put(robotBrandEnumSeq, robotService);
}
}
public interface RobotService {
String sendMessage(Integer robotId);
}
public enum RobotTypeEnum {
/**
* 阿里机器人
*/
ALI(1),
/**
* 小米机器人
*/
XIAOMI(2);
private final int seq;
RobotTypeEnum(int seq) {
this.seq = seq;
}
public int getSeq() {
return seq;
}
}
@PostConstruct:指使用该注解的方法在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法;
@Service
public class AliRobotServiceImpl implements RobotService {
@Autowired
private RobotFactory robotFactory;
@PostConstruct
private void init() {
robotFactory.putRobot(RobotTypeEnum.ALI.getSeq(), this);
}
@Override
public String sendMessage(Integer robotId) {
return "阿里机器人";
}
}
@Service
public class XiaoMiRobotServiceImpl implements RobotService {
@Autowired
private RobotFactory robotFactory;
@PostConstruct
private void init() {
robotFactory.putRobot(RobotTypeEnum.XIAOMI.getSeq(), this);
}
@Override
public String sendMessage(Integer robotId) {
return "小米机器人";
}
}
工厂方法模式
工厂方法模式是定义一个工厂接口基类,接口中定义具体的方法;每个产品都有自己的工厂来实现该基类,并创建对应的实例对象;
跟简单工厂方法相比,不需要通过参数来区分创建机器人,自己知道想要的机器人,可以直接创建;
public interface RobotFactory {
Object createRobot();
}
@Component
public class AliRobotFactory implements RobotFactory{
@Autowired
private AliRobot aliRobot;
@Override
public Object createRobot() {
return aliRobot;
}
}
@Component
public class XiaoMiRobotFactory implements RobotFactory{
@Autowired
private XiaoMiRobot xiaoMiRobot;
@Override
public Object createRobot() {
return xiaoMiRobot;
}
}
抽象工厂模式
跟工厂方法模式比,工厂方法模式只能创建机器人如果需要创建其他的就需要新增工厂,而抽象工厂模式进行了扩展,这样就是在同一个工厂创建其他的比如说机器人、手机等等;
public interface Factory {
Object createRobot();
Object createPhone();
}
@Component
public class AliFactory implements Factory {
@Autowired
private AliRobot aliRobot;
@Autowired
private XiaoMiPhone xiaoMiPhone;
@Override
public Object createRobot() {
return aliRobot;
}
@Override
public Object createPhone() {
return xiaoMiPhone;
}
}
@Component
public class XiaoMiFactory implements Factory {
@Autowired
private XiaoMiRobot xiaoMiRobot;
@Autowired
private XiaoMiPhone xiaoMiPhone;
@Override
public Object createRobot() {
return xiaoMiRobot;
}
@Override
public Object createPhone() {
return xiaoMiPhone;
}
}