工厂模式是一种常用的软件设计模式,它是创建型设计模式的一种,主要用来封装对象的创建过程,使得客户端无需关注具体的对象创建细节,而是通过一个统一的接口或者类来获取所需的对象。工厂模式分为简单工厂模式、工厂方法模式和抽象工厂模式。
**简单工厂模式**:
简单工厂模式通常有一个静态工厂类,它负责根据传入的参数或条件来创建并返回所需类型的对象。在这个模式中,工厂类通常是单一职责的,只负责对象的创建。例如,一个简单的运算符工厂可以根据传入的运算符字符串(如"+"、"-"、"*"、"/")来创建对应的运算对象(如OperationAdd、OperationSub、OperationMul、OperationDiv)。简单工厂模式的优点在于客户端代码可以保持简洁,不直接创建对象,避免了与具体类的耦合。然而,当需要添加新的运算符时,需要修改工厂类的代码,这违背了开闭原则,即对扩展开放,对修改关闭。
**工厂方法模式**:
工厂方法模式将对象的创建过程进一步抽象化,不再由单一的工厂类负责,而是将创建对象的逻辑交给各个子类。每个产品都有相应的工厂负责创建,这样增加了系统的灵活性。比如,当增加一个新的运算类(如N次方运算)时,只需要新增运算类和对应的工厂类,而无需修改原有工厂类。但缺点是客户端代码可能需要根据实际的产品类型来选择相应的工厂,增加了客户端的复杂性。
**抽象工厂模式**:
抽象工厂模式更进一步,它提供了一种创建一系列相关或相互依赖对象的接口,而不必指定它们的具体类。在这种模式中,有多个抽象产品类,每个抽象产品类可以有多个具体产品类。抽象工厂类可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例。比如,一个数据库访问抽象工厂可以派生出SQL Server工厂和Access工厂,分别创建对应数据库的产品(如用户类和部门类的实例)。抽象工厂模式的主要优点是可以容易地更换产品系列,如在数据库系统中切换数据库类型。但缺点是在扩展产品线时,可能会涉及到多个类的修改,且客户端代码可能需要知道具体工厂类的类型。
**反射实现**:
为了克服抽象工厂模式在扩展产品系列时的缺点,可以利用Java的反射机制。通过在配置文件中指定数据库类型,程序运行时动态加载相应的数据库工厂类,从而实现工厂的动态选择,而不需要修改客户端代码。这种方式提高了代码的灵活性和可维护性。
总结来说,工厂模式是一种强大的设计模式,用于封装对象的创建,提供了不同级别的抽象以适应不同的需求。简单工厂模式适用于产品种类较少且不易扩展的情况;工厂方法模式和抽象工厂模式则更适用于需要频繁扩展产品线或产品族的场景。结合反射等技术,可以在保持代码灵活性的同时,降低对客户端代码的侵入性。