RendererFactory.java

package com.example.renderer.bridge;

import com.example.renderer.adapter.LegacyRendererAdapter;
import com.example.renderer.adapter.LegacyRendererImpl;
import com.example.renderer.exception.RendererCreationException;
import com.example.renderer.legacy.LegacyRenderer;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.function.Supplier;

/**
 * 渲染器工厂,支持动态扩展渲染器实现。
 * 
 * <p>扩展机制:
 * <pre>
 * // 注册自定义渲染器
 * RendererFactory.register("custom", CustomRenderer::new);
 * 
 * // 创建实例
 * Renderer renderer = RendererFactory.create("custom");
 * </pre>
 * 
 * <p>内置渲染器:
 * <ul>
 *   <li>swing - SwingRenderer</li>
 *   <li>svg - SVGRenderer</li>
 *   <li>test - TestRenderer</li>
 *   <li>legacy - LegacyRendererAdapter</li>
 * </ul>
 */
public class RendererFactory {
    private static final ConcurrentMap<String, Supplier<Renderer>> renderers = new ConcurrentHashMap<>();
    private static final ReadWriteLock lock = new ReentrantReadWriteLock();
    
    static {
        // 内置渲染器注册
        registerInternal("swing", SwingRenderer::new);
        registerInternal("svg", SVGRenderer::new);
        registerInternal("test", TestRenderer::new);
        registerInternal("legacy", () -> new LegacyRendererAdapter(new com.example.renderer.adapter.LegacyRendererImpl()));
    }
    
    private static void registerInternal(String mode, Supplier<Renderer> supplier) {
        renderers.put(mode, supplier);
    }
    
    /**
     * 注册一个新的渲染器实现
     * 
     * @param mode 渲染模式名称
     * @param supplier 渲染器供应商
     */
    public static void register(String mode, Supplier<Renderer> supplier) {
        renderers.put(mode, supplier);
    }
    
    /**
     * 创建指定模式的渲染器实例
     * 
     * @param mode 渲染模式名称
     * @return 渲染器实例
     * @throws RendererCreationException 如果创建失败
     */
    public static Renderer create(String mode) throws RendererCreationException {
        try {
            Supplier<Renderer> supplier = renderers.get(mode);
            if (supplier == null) {
                throw new IllegalArgumentException("Unsupported render mode: " + mode);
            }
            Renderer renderer = supplier.get();
            if (renderer == null) {
                throw new RendererCreationException("Renderer creation failed for mode: " + mode);
            }
            return renderer;
        } catch (Exception e) {
            throw new RendererCreationException("Failed to create renderer", e);
        }
    }
    
    /**
     * 获取所有支持的渲染模式
     * 
     * @return 支持的渲染模式集合
     */
    public static Set<String> getSupportedModes() {
        return Collections.unmodifiableSet(renderers.keySet());
    }
}