java设计模式【工厂方法模式】工厂方法模式

工厂方法模式FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。

抽象工厂角色负责定义产品的创建接口,即产品的创建过程应当被推迟到子类中实现。具体工厂角色则实现这些创建接口,并负责实际创建产品的工作。抽象产品角色是工厂方法模式的核心,它定义了一个产品的接口,但并不实现具体的产品逻辑。具体产品角色则实现这些接口并负责具体的产品逻辑。

使用工厂方法模式可以在不修改具体工厂角色的情况下引入新的产品,从而简化了系统的设计,并提高了系统的可扩展性。

优缺点

优点

  1. 系统的可扩展性非常好。因为在添加新产品时,只需要添加新的具体工厂和具体产品,而不需要修改现有系统的代码。这样就保证了系统的可扩展性。

  2. 易于维护和管理。由于工厂方法模式将创建产品的逻辑推迟到子类中实现,因此可以更容易地进行维护和管理。子类可以在不改变父类接口的情况下添加新的特性,从而减少了系统的开销。

  3. 提高了系统的可靠性。因为在添加新产品时,只需要修改具体工厂类,而不需要修改客户端代码。这样可以减少因客户端代码变化而导致的系统崩溃的可能性。

缺点:

  1. 增加了系统的复杂度。在实现工厂方法模式时,需要引入抽象层,这样就增加了系统的抽象性和理解难度,同时也增加了实现的难度。

  2. 需要更多的代码编写。使用工厂方法模式需要编写新的具体工厂类和具体产品类,这样就会增加代码的复杂度和维护的难度。

使用场景

  1. 产品具有复杂的结构和层次关系,需要在多个子类之间共享某些共性逻辑。使用工厂方法模式可以将这些共性逻辑提取出来,作为一个独立的类进行封装,从而简化代码并提高系统的可扩展性。

  2. 系统需要提供一些通用的功能,但是这些功能可能会在不同的产品中被重复使用。使用工厂方法模式可以将这些通用功能提取出来,作为一个独立的类进行封装,从而降低系统的开发成本。

  3. 系统中需要使用组件化的设计思想,将不同的组件封装成独立的类。使用工厂方法模式可以将这些组件的创建过程推迟到子类中实现,从而简化代码并提高系统的可维护性。

  4. 系统需要支持动态添加和删除产品。使用工厂方法模式可以在不修改客户端代码的情况下动态添加和删除产品,从而提高系统的灵活性和可扩展性。

具体实现

以下以产品A,产品B为例实现工厂方法模式。

抽象工厂

抽象工厂定义产品的创建接口返回抽象产品

/** * 抽象工厂类 */public interface IFactory {    /**     * 定义创建产品接口     *     * @return 抽象产品     */    IProduct getInstance();}

具体工厂

具体工厂继承实现工厂实现创建产品接口返回具体的产品

产品A工厂类

/** * @author physicx * @date 2023/5/15 上午10:12 * @desc 产品A具体工厂类 * Created with IntelliJ IDEA */public class ProductAFactory implements IFactory {    /**     * 返回具体产品     *     * @return 产品A     */    @Override    public IProduct getInstance() {        return new ProductA();    }}

产品B工厂类

/** * @author physicx * @date 2023/5/15 上午10:18 * @desc 产品B具体工厂 * Created with IntelliJ IDEA */public class ProductBFactory implements IFactory {    /**     * 返回具体产品     *     * @return 产品B     */    @Override    public IProduct getInstance() {        return new ProductB();    }}

抽象产品

抽象产品接口定义产品的默认方法和各产品实现有差异的方法

/** * 抽象产品类 */public interface IProduct {    /**     * 产品公共方法     */    default void publicMethod() {        System.out.println("公共方法");    }    /**     * 各个产品有差异方法,子类具体实现     */    void printInfo();}

具体产品

具体产品实现抽象产品,各个产品对方法做自己的具体实现

产品A

/** * @author physicx * @date 2023/5/15 上午10:13 * @desc 产品A * Created with IntelliJ IDEA */public class ProductA implements IProduct {    private final static String NAME = "产品A";    /**     * 输出产品信息     */    @Override    public void printInfo() {        System.out.println("产品名称:" + NAME);    }}

产品B

/** * @author physicx * @date 2023/5/15 上午10:17 * @desc 产品B * Created with IntelliJ IDEA */public class ProductB implements IProduct {    private final static String NAME = "产品B";    /**     * 输出产品信息     */    @Override    public void printInfo() {        System.out.println("产品名称:" + NAME);    }}

调用示例

public static void main(String[] args) {        //产品A工厂方法调用        IProduct productA = new ProductAFactory().getInstance();        productA.printInfo();        //产品工厂方法调用        IProduct productB = new ProductBFactory().getInstance();        productB.printInfo();    }

运行结果如下:

补充说明

后续会依次更新 详解java 23种设计模式,欢迎关注、交流、补充相关内容(如下)。

快捷导航
设计模式简介总结
单例模式详解
工厂方法模式
抽象工厂模式