当前位置: 首页 > 知识库问答 >
问题:

用Spring配置抽象工厂的实现类

戚修雅
2023-03-14

--

我想创建一个工厂ScaleFactory,就像抽象工厂模式一样,我可以调用ScaleFactory.getScale(),以获得我在Spring XML中配置的任何实现的规模:

class ScaleFactory {
    Class<? extends Scale> scaleImplClass;
    public static Scale getScale() {
        return scaleImplClass.newInstance();
    }
}


Scale myScale = ScaleFactory.getScale();

但是,使用这种方法,我如何配置ScaleFactory应该使用Spring XML中的哪个实现呢?

@Autowired
ScaleFactory scaleFactory;

...

Scale myScale = scaleFactory.getScale();

--

另一种方法是在我的服务中使用类ScaleImplementationClass属性而不是ScaleFacotry,并使用ScaleFactory,如下所示:

@Value("${scaleImplementationClass}")
Class scaleImplementationClass

...

Scale myScale = ScaleFactory.getScale(scaleImplementationClass);

但是这个工厂就毫无意义了,因为我还可以运行ScaleImplementationClass.newInstance()

共有1个答案

黄永怡
2023-03-14

有几种不同的类似Spring的方法可以处理这个问题。我个人选择的方法有点像这样:

public interface ScaleFactory {

    public Scale newInstance();
    public String type();

}

public class FirstScaleFactory implements ScaleFactory {

    public Scale newInstance() {
        return new FirstScale();
    }

    public String type() {
        return "first";
    }    

}

public class SecondScaleFactory implements ScaleFactory {

    public Scale newInstance() {
        return new SecondScale();
    }

    public String type() {
        return "second";
    }    

}

public class ScaleManager {

    private final Map<String, ScaleFactory> factories;

    @Autowired
    public ScaleManager(List<ScaleFactory> factories) {
        this.factories = factories.stream()
            .collect(Collectors.toMap(f -> f.type(), Function::identity));
    }

    public Scale newInstance(String type) {
        return Optional.ofNullable(factories.get(type))
            .map(factory -> factory.newInstance())
            .orElseThrow(IllegalArgumentException::new);
    }

}

使用这种方法,您的ScaleManager是一个标准的Spring bean,可以连接到任何需要scale实例的类中。在初始化时,它获取Spring上下文中定义的所有ScaleFactory,并将它们作为列表 ,然后将其转换为映射(scaleFactory类型是键)。这样就不必担心scale的类名,并且可以在以后更改它们(只要保持type键一致)`

然后,您的ScaleFactory实现可以执行它们需要执行的任何操作。例如,如果您有一种刻度类型,并且您知道它是不可变的,那么您可以让工厂每次返回相同的实例。或者,您可以让每个调用返回一个单独的实例-刻度的实例化取决于实现相关的工厂。

 类似资料:
  • 问题内容: 我有一些抽象工厂 及其实现 Draw2DViewersFactory 。现在,我要创建一个类,该类负责按模型创建演示者/查看者并由Spring对其进行配置。因此,我需要在 .xml 配置中描述应调用的方法。可能是这样的(伪配置) 我该怎么办? 谢谢。 问题答案: 即使您的问题不清楚,我想我也知道您想知道的内容。您可以将spring bean定义为工厂实例,然后按如下所示设置此bean的

  • 主要内容:介绍,实现,Shape.java,Rectangle.java,Square.java,Circle.java,Color.java,Red.java,Green.java,Blue.java,AbstractFactory.java,ShapeFactory.java,ColorFactory.java,FactoryProducer.java,AbstractFactoryPatternDemo.java抽象工厂模式(Abstract Factory Pattern)是围绕一个超级

  • 抽象工厂模式 亦称: Abstract Factory 意图 抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。 问题 假设你正在开发一款家具商店模拟器。 你的代码中包括一些类, 用于表示: 1、一系列相关产品, 例如 椅子Chair 、 ​ 沙发Sofa和 咖啡桌Coffee­Table 。 2、系列产品的不同变体。 例如, 你可以使用 现代Modern 、 ​

  • 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 介绍 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 主要

  • 简介 抽象工厂模式是一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。 简例 有个

  • 抽象工厂模式也称为工厂工厂。 此设计模式属于创建设计模式类别。 它提供了创建对象的最佳方法之一。 它包括一个接口,负责创建与Factory相关的对象。 如何实现抽象工厂模式? 以下程序有助于实现抽象工厂模式。 class Window: __toolkit = "" __purpose = "" def __init__(self, toolkit, purpose):