2017-01-28 55 views
5

它是否正確使用java.util.function.Function實現工廠設計模式使用java.util.function.Function實現工廠設計模式

在下面的例子中,我使用功能參考實例一個Person類型的對象。

import java.util.function.Function; 

public class Main { 
    public static void main(String[] args) { 
     Function<String , Person> myFunc = (String s) -> new Person(s); 
     Person p = myFunc.apply("Shan"); 
     System.out.println(p.getName()); 
    } 
} 

class Person{ 
    private String name; 

    public Person(String name) { 
     this.name = name; 
    } 
    public String getName() { 
     return name; 
    } 


} 
+1

當然,爲什麼不呢?儘管'Function myFunc = Person :: new;'會更整潔。另請注意,這不能真正擴展到多個ctor參數... –

+1

工廠不明確。簡單的工廠和工廠方法是非常不同的。哪種模式? – Fuhrmanator

回答

3

工廠設計模式用於隱藏對象工廠的實現邏輯,其功能是使用繼承來實現此目的。假設您有多個類型的人,例如一個SmartPerson和一個DumbPerson(實現相同的Person基類)。人們可能會要求工廠創建一個聰明或愚蠢的人,而不必知道實現的差異,因爲它返回的所有內容都是一個Person對象。

您可以通過引用構造函數的函數實例化一個人,但是這種模式是關於對象創建的位置,允許您隱藏某些實現邏輯。

隱藏工廠背後的邏輯可以爲您節省大量時間,因爲不同的類可能會使用工廠來創建人員,因爲對創建人員的方式進行更改只會要求您修改創建方法在工廠裏,並不影響使用工廠的每個班級。

@Test 
public void testSimpleFactory() { 
    PersonFactory personFactory = new PersonFactory(); 
    Person person = personFactory.createPerson("dumb"); 
    person.doMath(); // prints 1 + 1 = 3 
} 


public class PersonFactory { 

    public Person createPerson(String characteristic) { 
     switch (characteristic) { 
      case "smart": 
       return new SmartPerson(); 
      case "dumb": 
       return new DumbPerson(); 
      default: 
       return null; 
     } 
    } 
} 

public interface Person { 
    void doMath(); 
} 

public class SmartPerson implements Person { 
    @Override 
    public void doMath() { 
     System.out.println("1 + 1 = 2"); 
    } 
} 

public class DumbPerson implements Person { 
    @Override 
    public void doMath() { 
     System.out.println("1 + 1 = 3"); 
    } 
} 
+2

注意這是**抽象**工廠模式。你傳入一個'Function ',接收者使用它來創建一個'Person' - 調用者不知道'Function'是否返回'SmartPerson'或'DumpPerson'(用你的例子)。它的調用者不知道每次是否返回同一個'Person'實例。這完全是工廠模式應該做的事情;從呼叫站點抽象出創建邏輯。 –

+0

@BoristheSpider不是本身,抽象工廠模式封裝了多個工廠 –

+2

'(String s) - >新的DumbPerson(s)'和'(String s) - >新的SmartPerson(s)'會給你兩個不同的「工廠」 。 – Calculator