有时单个设计模式并不能满足我们的业务需求,这个时候就要根据具体的业务来混合使用设计模式,其中策略模式和工厂模式是比较常用的一个组合。工厂模式可以管理具体策略的生命周期,策略模式可以丰满具体细节的逻辑。
interface Strategy {
void execute();
}
// 具体策略类1
class StrategyImpl1 implements Strategy {
@Override
public void execute() {
System.out.println("执行策略1");
}
}
// 具体策略类2
class StrategyImpl2 implements Strategy {
@Override
public void execute() {
System.out.println("执行策略2");
}
}
// 工厂接口
interface Factory {
Strategy createStrategy();
}
// 具体工厂类1
class FactoryImpl1 implements Factory {
@Override
public Strategy createStrategy() {
return new StrategyImpl1();
}
}
// 具体工厂类2
class FactoryImpl2 implements Factory {
@Override
public Strategy createStrategy() {
return new StrategyImpl2();
}
}
// 测试类
public class Main {
public static void main(String[] args) {
Factory factory1 = new FactoryImpl1();
Strategy strategy1 = factory1.createStrategy();
strategy1.execute();
Factory factory2 = new FactoryImpl2();
Strategy strategy2 = factory2.createStrategy();
strategy2.execute();
}
}
在这个示例中,我们定义了一个策略接口和两个具体策略类。然后,我们创建了一个工厂接口和两个具体工厂类,每个工厂类负责创建不同的策略实例。最后,在测试类中,我们使用工厂类创建了不同的策略实例,并调用它们的执行方法。
以上只是个简单的示例,我们可以把工厂模式用map改进一下,并不需要这么多的子工厂类。
interface Strategy {
void execute();
}
// 具体策略类1
class StrategyImpl1 implements Strategy {
@Override
public void execute() {
System.out.println("执行策略1");
}
@PostConstruct
public void registryFactory(){
Factory.CHOOSER_MAP.registry("1",this);
}
}
// 具体策略类2
class StrategyImpl2 implements Strategy {
@Override
public void execute() {
System.out.println("执行策略2");
}
@PostConstruct
public void registryFactory(){
Factory.CHOOSER_MAP.registry("2",this);
}
}
// 工厂接口
public class Factory {
private final static Map<String, Strategy > CHOOSER_MAP = new ConcurrentHashMap<>();
public static void registry(String code, Strategy strategy ) {
CHOOSER_MAP.put(code, strategy );
}
public static Strategy chose(String code) {
CHOOSER_MAP.get(code);
}
}
// 测试类
public class Main {
public static void main(String[] args) {
StrategyImpl1 StrategyImpl1 = PlatformChooserFactory.chose(“1”);
StrategyImp2 StrategyImpl2 = PlatformChooserFactory.chose(2”);
}
}
以上就是改造后的代码,这样就比较简单直观了。工厂类中我们使用map去存储具体的策略类,并且提供注册和获取方法。具体策略类在初始化的时候,会把当前类注册到工厂类的map中。这样我们使用的时候,只要根据具体的key就可以拿到具体的策略类。
优点:
缺点:
需要根据具体的应用场景和需求来权衡使用策略模式和工厂模式的混合。在某些情况下,这种组合可以提供更灵活、可扩展和可维护的设计,但也需要考虑代码复杂性和类的数量增加的影响。