工厂方法模式

定义

定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象,使一个产品类的实例化延迟到其工厂的子类。

UML图

示例代码

java 复制代码
package com.sumlv.demo;

import com.sumlv.demo.factory.ProductFactory;
import com.sumlv.demo.factory.ProductFactoryMap;
import com.sumlv.demo.product.Product;

/**
 * 客户端
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-02-25
 */
public class Client {

    public static void main( String[] args ) {
        ProductFactory factory = ProductFactoryMap.getProductFactory(args[0]);
        Product product = factory.getInstance();
        Object result = product.execute(args[2]);

        System.out.println(result);
    }

}
java 复制代码
package com.sumlv.demo.factory;

import com.sumlv.demo.factory.impl.SubProduct1Factory;
import com.sumlv.demo.factory.impl.SubProduct2Factory;

import java.util.HashMap;
import java.util.Map;

/**
 * 产品工厂映射
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-02-25
 */
public class ProductFactoryMap {

    /**
     * 工厂映射
     */
    private static final Map<String, ProductFactory> FACTORY_MAP = new HashMap<>();

    static {
        FACTORY_MAP.put("1", new SubProduct1Factory());
        FACTORY_MAP.put("2", new SubProduct2Factory());
    }

    /**
     * 根据key获取对应工厂实例
     *
     * @param key key
     * @return 工厂实例
     */
    public static ProductFactory getProductFactory(String key) {
        return FACTORY_MAP.get(key);
    }


    private ProductFactoryMap() {
        throw new RuntimeException();
    }

}
java 复制代码
package com.sumlv.demo.factory;

import com.sumlv.demo.product.Product;

/**
 * 产品工厂
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-02-25
 */
public interface ProductFactory {

    /**
     * 获取产品实例
     *
     * @return 产品实例
     */
    Product getInstance();

}
java 复制代码
package com.sumlv.demo.factory.impl;

import com.sumlv.demo.factory.ProductFactory;
import com.sumlv.demo.product.Product;
import com.sumlv.demo.product.impl.SubProduce2;

/**
 * 子产品1工厂
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-02-25
 */
public class SubProduct1Factory implements ProductFactory {

    @Override
    public Product getInstance() {
        return new SubProduce1();
    }

}
java 复制代码
package com.sumlv.demo.factory.impl;

import com.sumlv.demo.factory.ProductFactory;
import com.sumlv.demo.product.Product;
import com.sumlv.demo.product.impl.SubProduce2;

/**
 * 子产品2工厂
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-02-25
 */
public class SubProduct2Factory implements ProductFactory {

    @Override
    public Product getInstance() {
        return new SubProduce2();
    }

}
java 复制代码
package com.sumlv.demo.product;

/**
 * 产品接口
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-02-25
 */
public interface Product {

    /**
     * 业务逻辑
     *
     * @param param 方法参数
     * @return 执行结果
     */
    Object execute(Object param);

}
java 复制代码
package com.sumlv.demo.product.impl;

import com.sumlv.demo.product.Product;

/**
 * 子产品1
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-02-25
 */
public class SubProduce1 implements Product {

    @Override
    public Object execute(Object param) {
        // 子产品1执行逻辑。。。
        return new Object();
    }

}
java 复制代码
package com.sumlv.demo.product.impl;

import com.sumlv.demo.product.Product;

/**
 * 子产品2
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-02-25
 */
public class SubProduce2 implements Product {

    @Override
    public Object execute(Object param) {
        // 子产品2执行逻辑。。。
        return new Object();
    }

}

优缺点分析

优点:

  1. 用户仅需知道工厂名称即可获取想要的产品实例,无需关注产品本身的创建过程;

  2. 当产品需要拓展时,只需在产品接口和工厂接口下分别拓展对应子类实现即可,无需对已有代码进行修改,符合开闭原则。

缺点:

  1. 每增加一个产品就必须添加一个工厂类和一个产品类,会增加系统的复杂度。
相关推荐
逆境不可逃6 天前
【从零入门23种设计模式01】创建型之工厂模式(简单工厂+工厂方法+抽象工厂)
java·spring·设计模式·简单工厂模式·工厂方法模式·抽象工厂模式·工厂模式
Remember_99325 天前
Java 工厂方法模式:解耦对象创建的优雅方案
java·开发语言·python·算法·工厂方法模式
她和夏天一样热1 个月前
【设计模式】工厂方法模式在开发中的真实应用
设计模式·工厂方法模式
进击的小头1 个月前
创建型模式:工厂方法模式(C语言实现)
c语言·工厂方法模式
小码过河.1 个月前
设计模式——工厂方法模式
设计模式·工厂方法模式
sg_knight1 个月前
工厂方法模式(Factory Method)
java·服务器·python·设计模式·工厂方法模式·工厂模式
不是蔬菜1 个月前
工厂方法模式
工厂方法模式
apolloyhl1 个月前
工厂方法模式
工厂方法模式
Geoking.2 个月前
【设计模式】工厂方法模式(Factory Method)详解:从简单工厂到真正的“面向扩展”
设计模式·工厂方法模式