MST

星途 面试题库

面试题:Java工厂模式在微服务架构中的优化与拓展

在一个基于Spring Cloud的微服务架构中,现有服务需要创建多种不同类型的资源对象,且这些对象的创建逻辑复杂多变。请基于Java工厂模式进行优化设计,不仅要考虑如何实现灵活的对象创建,还要兼顾可扩展性、性能优化以及与微服务架构的融合,详细说明设计方案及关键代码实现。
46.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

设计方案

  1. 抽象工厂类:创建一个抽象的工厂类,定义创建不同类型资源对象的抽象方法。这个抽象工厂类是整个工厂模式的核心,它为具体工厂类提供了统一的接口。
  2. 具体工厂类:针对每一种具体的资源对象创建逻辑,实现抽象工厂类中的抽象方法。这样,当需要添加新的资源对象类型时,只需新增一个具体工厂类,符合开闭原则,保证了可扩展性。
  3. 资源对象接口及实现类:定义资源对象的接口,不同类型的资源对象实现该接口。这样可以保证所有资源对象具有统一的操作接口,便于在微服务中进行统一管理和调用。
  4. Spring集成:利用Spring的依赖注入和配置功能,将工厂类和资源对象注册到Spring容器中。这样可以方便地在微服务的各个组件中获取和使用这些对象,实现与微服务架构的融合。
  5. 性能优化:可以考虑使用缓存机制来存储已经创建的资源对象,避免重复创建,提高性能。例如,使用Guava Cache或者Spring Cache。

关键代码实现

  1. 定义资源对象接口及实现类
// 资源对象接口
public interface ResourceObject {
    void doSomething();
}

// 具体资源对象实现类1
public class ResourceObjectType1 implements ResourceObject {
    @Override
    public void doSomething() {
        System.out.println("ResourceObjectType1 is doing something.");
    }
}

// 具体资源对象实现类2
public class ResourceObjectType2 implements ResourceObject {
    @Override
    public void doSomething() {
        System.out.println("ResourceObjectType2 is doing something.");
    }
}
  1. 抽象工厂类
// 抽象工厂类
public abstract class ResourceObjectFactory {
    public abstract ResourceObject createResourceObject();
}
  1. 具体工厂类
// 具体工厂类1,用于创建ResourceObjectType1
public class ResourceObjectType1Factory extends ResourceObjectFactory {
    @Override
    public ResourceObject createResourceObject() {
        return new ResourceObjectType1();
    }
}

// 具体工厂类2,用于创建ResourceObjectType2
public class ResourceObjectType2Factory extends ResourceObjectFactory {
    @Override
    public ResourceObject createResourceObject() {
        return new ResourceObjectType2();
    }
}
  1. Spring配置及使用
// Spring配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ResourceObjectConfig {
    @Bean
    public ResourceObjectFactory resourceObjectType1Factory() {
        return new ResourceObjectType1Factory();
    }

    @Bean
    public ResourceObjectFactory resourceObjectType2Factory() {
        return new ResourceObjectType2Factory();
    }
}

// 在服务中使用工厂创建资源对象
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ResourceService {
    private final ResourceObjectFactory resourceObjectType1Factory;
    private final ResourceObjectFactory resourceObjectType2Factory;

    @Autowired
    public ResourceService(ResourceObjectFactory resourceObjectType1Factory, ResourceObjectFactory resourceObjectType2Factory) {
        this.resourceObjectType1Factory = resourceObjectType1Factory;
        this.resourceObjectType2Factory = resourceObjectType2Factory;
    }

    public void useResourceObjectType1() {
        ResourceObject resourceObject = resourceObjectType1Factory.createResourceObject();
        resourceObject.doSomething();
    }

    public void useResourceObjectType2() {
        ResourceObject resourceObject = resourceObjectType2Factory.createResourceObject();
        resourceObject.doSomething();
    }
}
  1. 性能优化(以Guava Cache为例)
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class CachedResourceService {
    private final Cache<String, ResourceObject> cache = CacheBuilder.newBuilder()
           .maximumSize(100)
           .expireAfterWrite(10, TimeUnit.MINUTES)
           .build();

    private final ResourceObjectFactory resourceObjectType1Factory;
    private final ResourceObjectFactory resourceObjectType2Factory;

    public CachedResourceService(ResourceObjectFactory resourceObjectType1Factory, ResourceObjectFactory resourceObjectType2Factory) {
        this.resourceObjectType1Factory = resourceObjectType1Factory;
        this.resourceObjectType2Factory = resourceObjectType2Factory;
    }

    public ResourceObject getResourceObjectType1() {
        return cache.get("type1", () -> resourceObjectType1Factory.createResourceObject());
    }

    public ResourceObject getResourceObjectType2() {
        return cache.get("type2", () -> resourceObjectType2Factory.createResourceObject());
    }
}