Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在某些情况下,正在使用工厂或建筑商模式_Java_Design Patterns - Fatal编程技术网

Java 在某些情况下,正在使用工厂或建筑商模式

Java 在某些情况下,正在使用工厂或建筑商模式,java,design-patterns,Java,Design Patterns,我正在阅读以下链接: 我注意到,在使用工厂模式时,我看到的所有示例都在工厂中使用无参数构造函数。在最后一个链接中,如果参数增长,可以考虑使用Builder模式。我知道何时以及如何使用builder模式,但是工厂模式让我感到困惑。如果您有具有参数的子类,其中一些参数对于子类是唯一的,会发生什么情况?在这种情况下你会怎么做 举个例子: 假设您有以下抽象类: public abstract class Client { private String clientID; priv

我正在阅读以下链接:

我注意到,在使用工厂模式时,我看到的所有示例都在工厂中使用无参数构造函数。在最后一个链接中,如果参数增长,可以考虑使用Builder模式。我知道何时以及如何使用builder模式,但是工厂模式让我感到困惑。如果您有具有参数的子类,其中一些参数对于子类是唯一的,会发生什么情况?在这种情况下你会怎么做

举个例子:

假设您有以下抽象类:

public abstract class Client {

    private String clientID;
    private String clientFirstName;
    private String clientLastName;

    public Client(String ID, String firstname, String lastname)
    {
        this.clientID = ID;
        this.clientFirstName = firstname;
        this.clientLastName  = lastname;

    }
}
以及以下子类:

public class Domestic extends Client {
    public Domestic(String ID, String firstname, String lastname) {
        super(ID, firstname, lastname);

    }
}


public class International extends Client {

  private List<String> documents;

  public International(String ID, String firstname, String lastname, List<String> documents) {
    super(ID, firstname, lastname);

       this.documents = documents;

    }


当您决定实际需要一棵树时会发生什么情况,如:

Client
 |
 -- Domestic Client
 |
 -- International_client
    |
    |_ APAC Client
    |
    |_ EMEA client
    |
    |_ South America Client
    |
    |_ I'm not very creative, but imagine there are a bunch more.
突然,当您需要实例化对象时,您的代码会像这样结束:

if (domestic) {
  client = new DomesticClient(...);
} else if (international) {
  if (apac) {
    client = new APACClient(); 
  } else if (emea) {
    client = new EMEAClient();
  } else if (sa) {
    client = new SouthAmericaClient();
  } 
...
}
随着可能性的增加,您希望代码库中的这些积垢变得模糊的可能性也会降低。也许你甚至不想让打电话的人知道他们有什么样的客户。抽象应该隐藏不同的实现,对吗?作为客户,为什么我需要知道John Smith的客户ID 1234是国际性的。也许我想打个电话,比如:

 Client c = Client.ForCustomerId(id);

神奇地得到了合适的客户机类型,而不预先知道他们真正是什么类型的客户机

当你考虑一个小问题时,许多设计模式在实用性方面没有多大意义。当问题变得相当复杂时,它们就会发光。例如,在我看来,构建器模式在这里不会像现在这样太有用——如果你A)有大量的选项,或者B)根据不同的用例有不同的/可选的选项,那么它会更有用。您所描述的有一组固定的小参数


现在,如果您开始添加一组参数-可能您需要美国客户的SSN或欧盟客户的VAT信息,等等-可能有必要移动到一个构建器,当您有这些参数时,它会接收这些参数,并最终生成对象。

当您决定实际需要一个类似以下的树时,会发生什么情况:

Client
 |
 -- Domestic Client
 |
 -- International_client
    |
    |_ APAC Client
    |
    |_ EMEA client
    |
    |_ South America Client
    |
    |_ I'm not very creative, but imagine there are a bunch more.
突然,当您需要实例化对象时,您的代码会像这样结束:

if (domestic) {
  client = new DomesticClient(...);
} else if (international) {
  if (apac) {
    client = new APACClient(); 
  } else if (emea) {
    client = new EMEAClient();
  } else if (sa) {
    client = new SouthAmericaClient();
  } 
...
}
随着可能性的增加,您希望代码库中的这些积垢变得模糊的可能性也会降低。也许你甚至不想让打电话的人知道他们有什么样的客户。抽象应该隐藏不同的实现,对吗?作为客户,为什么我需要知道John Smith的客户ID 1234是国际性的。也许我想打个电话,比如:

 Client c = Client.ForCustomerId(id);

神奇地得到了合适的客户机类型,而不预先知道他们真正是什么类型的客户机

当你考虑一个小问题时,许多设计模式在实用性方面没有多大意义。当问题变得相当复杂时,它们就会发光。例如,在我看来,构建器模式在这里不会像现在这样太有用——如果你A)有大量的选项,或者B)根据不同的用例有不同的/可选的选项,那么它会更有用。您所描述的有一组固定的小参数

现在,如果您开始添加一组参数-可能您需要美国客户的SSN或欧盟客户的VAT信息,等等-可能有必要移动到一个构建器,当您有这些参数时,它会接收这些参数,并最终生成对象