设计模式:策略模式和工厂模式混合使用

目录

有时单个设计模式并不能满足我们的业务需求,这个时候就要根据具体的业务来混合使用设计模式,其中策略模式和工厂模式是比较常用的一个组合。工厂模式可以管理具体策略的生命周期,策略模式可以丰满具体细节的逻辑。

代码示例

java 复制代码
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改进一下,并不需要这么多的子工厂类。

java 复制代码
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就可以拿到具体的策略类。

优缺点

优点:

  1. 灵活性:策略模式允许在运行时选择不同的策略,而工厂模式可以根据需求创建相应的对象。这种组合可以使系统更加灵活,能够根据不同的需求选择合适的策略和对象。
  2. 可扩展性:通过工厂模式,可以轻松添加新的具体产品或策略,而无需修改现有代码。这使得系统更容易扩展,可以根据需要动态添加新的产品和策略。
  3. 代码复用:策略模式和工厂模式都鼓励代码的重用。策略模式中的策略和工厂模式中的产品可以在不同的上下文中被重复使用,避免了重复编写相似的代码。
  4. 松耦合:策略模式和工厂模式的结合可以实现松耦合的设计。策略模式通过接口与具体策略解耦,工厂模式通过抽象工厂与具体产品解耦。这种松耦合设计使得系统更加灵活、可维护和可测试。

缺点:

  1. 增加复杂性:使用策略模式和工厂模式的混合会增加代码的复杂性,需要定义多个接口、类和实现。这可能会增加开发和维护的成本。
  2. 增加类的数量:使用策略模式和工厂模式的混合可能导致类的数量增加,特别是在有多个具体策略和产品时。这可能会增加系统的复杂性和内存占用。

总结

需要根据具体的应用场景和需求来权衡使用策略模式和工厂模式的混合。在某些情况下,这种组合可以提供更灵活、可扩展和可维护的设计,但也需要考虑代码复杂性和类的数量增加的影响。

相关推荐
码智社1 小时前
Java实现RSA密钥生成、加密解密、加签验签
java
wear工程师1 小时前
ThreadLocal 在线程池里为什么会串数据:别只会答内存泄漏
java·后端
Iruoyaoxh1 小时前
栈和队列~
java·开发语言
审小匠OpenCPAi1 小时前
银行流水核查怎么自动化?单边匹配、双向勾稽与图聚类异常检测的工程对比
java·前端·人工智能·python·审计
码上上班2 小时前
docker课程
java·docker·容器
腻害兔2 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:CRM 客户关系模块深度解析——从线索到回款,一套完整的 B2B 销售闭环是怎么搭的?
java·前端·javascript·vue.js·产品经理·ai编程
达子6662 小时前
第9章_HarmonyOs图解 用Java开发UI
java·ui·harmonyos
龙虾PRO4 小时前
能源与股票量化核心差异,AI全链路落地实操手册
java·面试·职场和发展
llwszx4 小时前
【Java/Go后端手撸原生Agent(第九篇):Plan-and-Execute规划模式——从“走一步看一步“到“先谋后动“】
java·python·golang·agent开发·plan模式·规划执行模式
ZJH__GO4 小时前
网络编程v2--多客户端互通
java·运维·服务器·开发语言·计算机网络