2017-04-22 10 views
1

나는 스프링 프레임 워크를 배우고있다. 웹 사이트에서 많은 튜토리얼을 읽었지만 설명을들을 수 없었다. 쉬운 방법으로 간단히 설명해주십시오.스프링 프레임 워크를 사용하여 어디에서 느슨한 커플 링을 달성 할 수 있습니까?

  1. 여기서는 느슨한 커플 링을 달성하기 위해 공장 설계 패턴을 넣었으며 스프링에서이 디자인 패턴을 어떻게 사용합니까?

  2. "이 패턴은 객체를 만드는 가장 좋은 방법 중 하나를 제공합니다"라는 문장을 얻을 수 없습니다.

    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. 
    

답변

0

여기서 각 호출에서 새 인스턴스를 만드는 클래식 팩토리를 사용합니다. 그러나 팩토리는 두 가지 포인트를 누락합니다. getShape()은 정적 메소드를 제공해야하며 팩토리 클래스는 두 번 이상 인스턴스화 할 수 없습니다.

팩토리 클래스에 대한 싱글 톤 및 정적 메서드 사용 : 테스트 중 조롱은 더 복잡합니다. 응용 프로그램 : 클라이언트 클래스 및 팩토리
Spring이 제공하는 의존성 주입 (하지만 이것은 단독으로는 아니지만)은 이러한 우려를 해결합니다.
Spring은 실제로 팩토리의 역할을 담당하며 싱글 톤 문제는 Spring에서도 처리됩니다. 공장 콩 및 공장 방법을 사용하여

  • :

    봄, 당신은 충분히 유사한 일을하는 몇 가지 방법이있다. XML과 Java 버전이 있습니다.
    XML 방식은 XML 방식입니다. 간결하고 사용 된 Spring 구성을 읽는 간접 참조를 생성하는 대신 클래스에 직접 주석을 추가하는 것이 반드시 필요한 것은 아닙니다.
    Java 버전은 간접적 인 단점이 없지만 팩토리 클래스가 스프링 FactoryBean 인터페이스를 구현해야하므로 조금 더 장황하다.

  • prototype 범위가 주석 된 클래식 스프링 빈을 사용하십시오.

봄의 상당 수 :

@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; 
} 

어떤 방법으로, 당신은 shapeType 인수를 전송하는 BeanFactory 또는 ApplicationContextObject getBean(String name, Object... args) 방법을 사용해야합니다.

Shape shape = (Shape) applicationContext.getBean("shape", "CIRCLE"); 
+0

여기 느슨한 결합을 달성 않았다 예를 들어

? –

+1

봄. 1)'ApplicationContext'는 Spring 클래스입니다. 클라이언트는 팩토리 클래스가 아닌 클라이언트에 연결됩니다. 2)'shape()'을 간단하게 조롱 할 수 있습니다. – davidxxx

+0

느슨한 커플 링 예제를 알려주시겠습니까? –

0

봄 : 당신은 @Component 또는 @Bean로 공장을 선언하고 당신이 그것을 필요로하는 코드의 어떤 장소에 autowire하기 수 있습니다.

따라서 생성자를 호출하는 것을 피할 수 있으며 응용 프로그램 시작시 factory의 싱글 톤 인스턴스가 applicationContext에로드됩니다.

공장 : 팩토리의 목적은 인스턴스 작성의 모든 논리를 팩토리의 메소드로 랩핑하여 오브젝트 작성을 단순화하는 것입니다. 여러 곳에서 같은 객체를 여러 번 필요로한다면 생성자 호출을 피하고 setter에게 값을 전달할 수 있지만 factory의 단일 메소드 만 호출하면됩니다.