使用java.util.function.Function实现Factory Design Pattern

SIW*_*SIW 5 java design-patterns

使用java.util.function.Function实现Factory Design Pattern是否正确

在下面的示例中,我使用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;
    }


}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ens 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这是一个**抽象**工厂模式。您传入一个 `Function&lt;String , Person&gt;` ,接收者使用它来创建一个 `Person` - 调用者不知道该 `Function` 是否返回一个 `SmartPerson` 或 `DumpPerson` (使用您的示例)。调用者不知道每次是否返回相同的“Person”实例。这正是工厂模式应该做的事情;从调用站点抽象出创建逻辑。 (2认同)
  • `(String s) -&gt; new DumbPerson(s)` 和 `(String s) -&gt; new SmartPerson(s)` 会给你两个不同的“工厂”。 (2认同)