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