当前位置: 首页 > 面试题库 >

使用Spring 3注释实现简单的工厂模式

孔俊友
2023-03-14
问题内容

我想知道如何用Spring 3注释实现简单的工厂模式。我在文档中看到,您可以创建调用工厂类并运行工厂方法的bean。我想知道是否可以仅使用注释。

我有一个当前正在调用的控制器

MyService myService = myServiceFactory.getMyService(test);
result = myService.checkStatus();

MyService是具有一个称为checkStatus()的方法的接口。

我的工厂班级看起来像这样:

@Component
public class MyServiceFactory {

    public static MyService getMyService(String service) {
        MyService myService;

        service = service.toLowerCase();

        if (service.equals("one")) {
            myService = new MyServiceOne();
        } else if (service.equals("two")) {
            myService = new MyServiceTwo();
        } else if (service.equals("three")) {
            myService = new MyServiceThree();
        } else {
            myService = new MyServiceDefault();
        }

        return myService;
    }
}

MyServiceOne类如下所示:

@Autowired
private LocationService locationService;

public boolean checkStatus() {
      //do stuff
}

当我运行此代码时,locationService变量始终为null。我相信这是因为我是在工厂内部自己创建对象,并且不会进行自动装配。有没有添加注释以使其正常工作的方法?

谢谢


问题答案:

没错,通过手动创建对象,您不会让Spring执行自动装配。还考虑在Spring之前管理您的服务:

@Component
public class MyServiceFactory {

    @Autowired
    private MyServiceOne myServiceOne;

    @Autowired
    private MyServiceTwo myServiceTwo;

    @Autowired
    private MyServiceThree myServiceThree;

    @Autowired
    private MyServiceDefault myServiceDefault;

    public static MyService getMyService(String service) {
        service = service.toLowerCase();

        if (service.equals("one")) {
            return myServiceOne;
        } else if (service.equals("two")) {
            return myServiceTwo;
        } else if (service.equals("three")) {
            return myServiceThree;
        } else {
            return myServiceDefault;
        }
    }
}

但我认为总体设计会很差。那岂不是更好有一个一般的MyService执行和传递one/ two/
three字符串作为额外的参数checkStatus()?您想实现什么?

@Component
public class MyServiceAdapter implements MyService {

    @Autowired
    private MyServiceOne myServiceOne;

    @Autowired
    private MyServiceTwo myServiceTwo;

    @Autowired
    private MyServiceThree myServiceThree;

    @Autowired
    private MyServiceDefault myServiceDefault;

    public boolean checkStatus(String service) {
        service = service.toLowerCase();

        if (service.equals("one")) {
            return myServiceOne.checkStatus();
        } else if (service.equals("two")) {
            return myServiceTwo.checkStatus();
        } else if (service.equals("three")) {
            return myServiceThree.checkStatus();
        } else {
            return myServiceDefault.checkStatus();
        }
    }
}

仍然
设计不佳,因为添加新的MyService实现也需要MyServiceAdapter修改(违反SRP)。但这实际上是一个很好的起点(提示:地图和策略模式)。



 类似资料:
  • 活字印刷 面向对象 话说三国时期,曹操带领百万大军攻打东吴,大军在长江赤壁驻扎,军船连成一片,眼看就要灭掉东吴,统一天下,曹操大悦,于是大宴众文武,在酒席间,曹操诗兴大发,不觉吟道:喝酒唱歌,人生真爽。众文武齐呼:“丞相好诗!于是一臣子速命印刷工匠刻板印刷,以便流传天下。” 样张出来给曹操一看,曹操感觉不妥,说到:“喝与唱,此话过俗,应该为‘对酒当歌’较好!”,于是此臣就命工匠重新来过。工匠眼看连

  • 本文向大家介绍js简单工厂模式用法实例,包括了js简单工厂模式用法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js简单工厂模式用法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的javascript程序设计有所帮助。

  • //抽象类 enum SpliterType { BinaryType = 0, TxtYype = 1 }; class ISplitter { public: virtual void split() = 0; virtual ~ISplitter() {} }; //具体类 class BinarySplitter : public ISplitter { public: voi

  • 一、简单工厂模式简介 1.定义 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 2.使用动机 考虑一个简单的软件应用场景:一个软件系统可以提供多个外观不同的

  • 简单工厂(Simple Factory) Intent 在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。 Class Diagram 简单工厂把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。 这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。客户类往往有多个,如果不使用简单工厂,那么所

  • 本文向大家介绍Ruby中使用设计模式中的简单工厂模式和工厂方法模式,包括了Ruby中使用设计模式中的简单工厂模式和工厂方法模式的使用技巧和注意事项,需要的朋友参考一下 之前有看过《ruby设计模式》,不过渐渐的都忘记了。现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下。 简单工厂模式: 这样写的好处是降低耦合。 比如增加一个开根号运算的时候,只需要在工厂类中添加一个分支