我们在哪里使用弹簧框架实现松耦合?

时间:2017-04-22 06:58:34

标签: java spring factory-pattern

我正在学习spring framework.I我从网站上阅读了很多教程,但我无法得到他们的解释。请以简单的方式简单地解释一下。

  1. 这里我把Factory设计模式放到松散耦合上,我们如何在Spring中使用这个设计模式。

  2. 我无法得到这一点(句子)"这种模式提供了创建对象的最佳方法之一#34;。

    public interface Shape {
           void draw();
        }
    
    public class Rectangle implements Shape {
    
       @Override
       public void draw() {
          System.out.println("Inside Rectangle::draw() method.");
       }
    }
    
    public class Square implements Shape {
    
       @Override
       public void draw() {
          System.out.println("Inside Square::draw() method.");
       }
    }
    
    public class Circle implements Shape {
    
       @Override
       public void draw() {
          System.out.println("Inside Circle::draw() method.");
       }
    }
    
    public class ShapeFactory {
    
       //use getShape method to get object of type shape 
       public Shape getShape(String shapeType){
          if(shapeType == null){
             return null;
          }     
          if(shapeType.equalsIgnoreCase("CIRCLE")){
             return new Circle();
    
          } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
             return new Rectangle();
    
          } else if(shapeType.equalsIgnoreCase("SQUARE")){
             return new Square();
          }
    
          return null;
       }
    }
    
    public class FactoryPatternDemo {
    
       public static void main(String[] args) {
          ShapeFactory shapeFactory = new ShapeFactory();
    
          //get an object of Circle and call its draw method.
          Shape shape1 = shapeFactory.getShape("CIRCLE");
    
          //call draw method of Circle
          shape1.draw();
    
          //get an object of Rectangle and call its draw method.
          Shape shape2 = shapeFactory.getShape("RECTANGLE");
    
          //call draw method of Rectangle
          shape2.draw();
    
          //get an object of Square and call its draw method.
          Shape shape3 = shapeFactory.getShape("SQUARE");
    
          //call draw method of circle
          shape3.draw();
       }
    }
    

    输出:

    Inside Circle::draw() method.
    Inside Rectangle::draw() method.
    Inside Square::draw() method.
    

2 个答案:

答案 0 :(得分:0)

弹簧: 您可以将工厂声明为@Component@Bean,然后将其自动装配到您需要的代码中的任何位置。

因此,您应该避免调用它的构造函数,并且在应用程序启动时,工厂的单例实例将被加载到applicationContext中。

厂: 工厂的目的是将实例创建的所有逻辑包装到工厂的方法中以简化对象创建。如果在许多地方需要多次使用相同的对象,则可以避免构造函数调用并将值传递给setter,但只能调用单个工厂方法。

答案 1 :(得分:0)

在这里,您使用经典工厂,在每次调用时创建新实例。 但工厂错过了两点:getShape()应提供静态方法,工厂类不应多次实例化。

对工厂类使用单例和静态方法带来了一些缺点:测试期间的模拟更复杂,工厂增加了它的职责(它是一个单例,但它也是一个工厂类),高级耦合是在类之间创建的应用:客户类和工厂。
Spring提供的依赖注入(但并不是唯一的)解决了这些问题 Spring确实扮演了工厂的角色,单身关注的问题也由Spring处理。

在Spring中,你有一些方法可以做类似的事情:

  • 使用factory-bean和factory-method。您有XML和Java版本 XML方式是XML方式:详细,如果您更喜欢直接注释类而不是创建间接读取使用的Spring配置,则不一定合适。
    Java版本没有间接缺点,但由于工厂类必须实现Spring FactoryBean接口,因此它更加冗长。

  • 使用带有prototype范围注释的经典Spring bean。

Spring中的等价物可能是:

@Bean
@Scope("prototype")
public Shape shape(String shapeType) {   
      if(shapeType == null){
         return null;
      }     
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();

      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();

      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }

      return null;   
}

无论如何,您应该使用Object getBean(String name, Object... args)BeanFactory的{​​{1}}方法来传输ApplicationContext参数。

例如:

shapeType