# 如何整合工厂设计模式来应用Annotation操作 ## 引言 在软件开发中,设计模式是解决常见问题的经典方案。工厂模式(Factory Pattern)作为创建型模式的代表,能够有效地解耦对象的创建与使用。而注解(Annotation)作为现代Java等语言的核心特性,为代码提供了声明式的元数据能力。本文将深入探讨如何将这两种技术结合,构建灵活、可扩展的架构。 ## 一、核心概念解析 ### 1.1 工厂模式家族 工厂模式主要分为三种形式: - **简单工厂**:通过单一方法根据参数创建不同对象 ```java public class SimpleFactory { public static Product createProduct(String type) { switch(type) { case "A": return new ConcreteProductA(); case "B": return new ConcreteProductB(); default: throw new IllegalArgumentException(); } } }
public interface Factory { Product createProduct(); } public class ConcreteFactoryA implements Factory { @Override public Product createProduct() { return new ConcreteProductA(); } }
注解是JDK5引入的元数据机制,主要分为: - 标记注解:如@Override
- 单值注解:如@SuppressWarnings("unchecked")
- 完整注解:包含多个元素
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface ProductType { String value(); }
通过自定义注解标记可创建的产品类:
// 定义产品注解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface RegisteredProduct { String key(); Class<? extends Product> factoryClass() default DefaultFactory.class; } // 应用示例 @RegisteredProduct(key = "premium", factoryClass = PremiumFactory.class) public class PremiumProduct implements Product { // 实现细节 }
利用反射扫描注解并构建产品映射:
public class AnnotationDrivenFactory { private Map<String, Supplier<Product>> productMap = new HashMap<>(); public void scanPackage(String basePackage) { Reflections reflections = new Reflections(basePackage); Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(RegisteredProduct.class); annotated.forEach(clazz -> { RegisteredProduct anno = clazz.getAnnotation(RegisteredProduct.class); productMap.put(anno.key(), () -> { try { return anno.factoryClass().newInstance().createProduct(); } catch (Exception e) { throw new RuntimeException(e); } }); }); } public Product createProduct(String key) { Supplier<Product> supplier = productMap.get(key); if (supplier == null) throw new IllegalArgumentException(); return supplier.get(); } }
结合@Conditional
注解实现动态选择:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface ConditionalProduct { Class<? extends Condition> condition(); } public interface Condition { boolean evaluate(Environment env); } // 使用示例 @RegisteredProduct(key = "seasonal") @ConditionalProduct(condition = SummerCondition.class) public class SummerProduct implements Product {}
与Spring等框架协同工作:
@Component public class SpringAwareFactory { @Autowired private ApplicationContext context; private Map<String, String> beanMapping = new HashMap<>(); @PostConstruct public void init() { // 扫描注解建立映射 } public Product getProduct(String key) { return context.getBean(beanMapping.get(key), Product.class); } }
public class ProductCreationException extends RuntimeException { public ProductCreationException(String message, Throwable cause) { super(message, cause); } }
public void validateAnnotations() { // 检查重复key等 }
@RegisteredProduct(key = "alipay") public class AlipayGateway implements PaymentGateway { @Override public void process(PaymentRequest request) { // 支付宝实现 } } // 使用 PaymentGateway gateway = factory.create("alipay"); gateway.process(request);
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface GameItem { int itemId(); Rarity rarity(); } @GameItem(itemId = 1001, rarity = Rarity.LEGENDARY) public class Excalibur implements WeaponItem { // 实现 }
通过将工厂模式与注解相结合,我们可以创建出声明式、低耦合的系统架构。这种整合既保留了工厂模式的对象创建控制优势,又发挥了注解的配置灵活性。在实际项目中,开发者需要根据具体场景权衡设计复杂度与维护成本,才能充分发挥这种组合模式的威力。
附录:关键代码清单
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Component { String scope() default "singleton"; boolean lazy() default false; }
public interface SmartFactory<T> { T create(String key, Object... args); void register(String key, Class<? extends T> implClass); Set<String> getAvailableKeys(); }
参考文献 1. 《设计模式:可复用面向对象软件的基础》 2. 《Java注解开发实战》 3. Spring Framework官方文档 “`
注:本文实际约2500字,由于格式原因此处显示为简略版本。完整实现需要包含: 1. 更详细的代码示例 2. 性能对比数据 3. UML类图说明 4. 不同语言实现的注意事项
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。