2017-04-22 60 views
1

我在學習spring framework。我從網站上看了很多教程,但是我無法得到他們的解釋。請用簡單的方式簡單地解釋我。我們在哪裏使用彈簧框架實現鬆耦合?

  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(); 
        } 
    } 
    

    OUTPUT:

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

回答

0

這裏您使用了一個經典的工廠,在每次調用時都會創建新的實例。 但是,工廠忽略了兩點:getShape()應該提供一個靜態方法,工廠類不應該超過一次instantiatiable。

對工廠類使用單例和靜態方法帶來一些缺點:在測試過程中模擬更復雜,工廠增加了它的職責(它是一個單例,但它也是一個工廠類),在類之間創建了高耦合的應用程序:客戶端類和工廠。
Spring提供的依賴注入(但並不孤單)解決了這些問題。
Spring確實扮演了工廠的角色,Spring的獨立關注也由Spring處理。

在Spring中,你有足夠的做類似的事情的一些方法:

  • 使用工廠豆和工廠方法。你有一個XML和一個Java版本。
    XML方式是XML方式:詳細而且不一定適合,如果您更喜歡直接註釋您的類而不是創建間接讀取使用的Spring配置。
    Java版本沒有間接缺點,但它稍微冗長些,因爲工廠類必須實現Spring FactoryBean接口。

  • 使用經典的Spring bean註釋的範圍爲prototype

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

以任何方式,你應該使用的BeanFactoryApplicationContextObject getBean(String name, Object... args)方法來傳輸shapeType說法。

例如:

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

你在哪裏這裏實現鬆耦合? –

+1

隨着春天。 1)'ApplicationContext'是一個Spring類。客戶端耦合到它而不是你的工廠類。 2)'形狀()'可以簡單地模擬。 – davidxxx

+0

你能告訴我任何鬆散耦合的例子嗎? –

0

春: 你可以聲明你的工廠爲@Component@Bean,然後將其自動裝配到在你需要它的代碼的任何地方。

因此,您將避免調用它的構造函數,並且在應用程序啓動時將工廠的單例實例加載到applicationContext中。

工廠: 工廠的目的是將實例創建的所有邏輯包裝到工廠的方法中以簡化對象創建。如果你在很多地方多次需要相同的對象,你可以避免構造函數的調用並將值傳遞給設置者,但只能調用工廠的單一方法。