工厂模式中每个工厂只生成一种具体产品,工厂模式里面分为四个角色
手机是一个抽象产品,手机制造厂是一个抽象工厂,华为手机是一个具体的产品,华为手机工厂是具体的工厂,华为手机工厂只生产华为手机不会生产别的手机。
策略模式的定义是定义一组算法,将每个算法封装起来,通过上下文使他们可以进行切换,策略模式让算法独立于根据使用他的客户变化而变化。
策略模式关注到具体的行为上。策略模式里面包含三个结构:
举个生活中的例子就是:洗衣机,洗衣机里面包含了不同的功能,有标准,快洗,脱水等等功能,这一个个功能就相当于不同的策略,通过洗衣机控制面板来调用不同的功能也就是不同的策略。
以制造手机为例子
可以先实现一个策略接口
public interface PhoneTypeHandler {
PhoneTypeEnum getPhoneTypeEnum();
void create();
void back();
}
然后有两个策略实现类
@Component
public class XiaomiPhoneTypeHandler implements PhoneTypeHandler {
@Override
public PhoneTypeEnum getPhoneTypeEnum() {
return PhoneTypeEnum.Xiaomi;
}
@Override
public void create() {
System.out.println("制造小米手机");
}
@Override
public void back() {
System.out.println("返厂小米手机");
}
}
@Component
public class HuaweiPhoneTypeHandler implements PhoneTypeHandler{
@Override
public PhoneTypeEnum getPhoneTypeEnum() {
return null;
}
@Override
public void create() {
System.out.println("制造华为手机");
}
@Override
public void back() {
System.out.println("返厂华为手机");
}
}
定义一个枚举用于实现调用具体的策略
public enum PhoneTypeEnum {
Xiaomi(1,"小米手机"),
Huawei(2,"华为手机");
int code;
String desc;
PhoneTypeEnum(int code,String desc){
this.code = code;
this.desc = desc;
}
public static PhoneTypeEnum getPhone(int code){
for (PhoneTypeEnum phoneTypeEnum : PhoneTypeEnum.values()){
if (phoneTypeEnum.code == code){
return phoneTypeEnum;
}
}
return null;
}
}
最后我们可以实现一个工厂类,将他们这些策略创建出来
public class PhoneHandlerFactory implements InitializingBean {
//将策略类自动的注入进list里面
@Resource
List<PhoneTypeHandler> phoneTypeHandlers = new ArrayList<>();
//相当于策略模式中的上下文用于管理和调度
HashMap<PhoneTypeEnum,PhoneTypeHandler> map = new HashMap();
//供外界调用策略
public PhoneTypeHandler getPhoneTypeHandler(int code){
PhoneTypeEnum phoneTypeEnum = PhoneTypeEnum.getPhone(code);
return map.get(phoneTypeEnum);
}
//凡是继承InitializingBean接口的类,在初始化bean的时候都会执行该方法
@Override
public void afterPropertiesSet() throws Exception {
//将代码和策略结合起来
for (PhoneTypeHandler phoneTypeHandler : phoneTypeHandlers){
map.put(phoneTypeHandler.getPhoneTypeEnum(),phoneTypeHandler);
}
}
}