打造智能建筑商
構(gòu)建API時(shí),您應(yīng)該始終考慮誰(shuí)將使用它。 當(dāng)API簡(jiǎn)單易用時(shí),用戶就會(huì)感到滿意。 當(dāng)用戶滿意時(shí),每個(gè)人也都會(huì)滿意。 但是出色的可用性并非總是容易實(shí)現(xiàn)的。 有一些模式對(duì)此有所幫助,在這篇文章中,我將重點(diǎn)介紹經(jīng)典的構(gòu)建器模式,以及如何使用步進(jìn)構(gòu)建器模式對(duì)其進(jìn)行增強(qiáng),以構(gòu)建沒(méi)有大腦接口,易于使用且不會(huì)出錯(cuò)的對(duì)象 。 因此,讓我們開(kāi)始繪制一些上下文,我們有2個(gè)域?qū)ο蟠磉B接到某個(gè)遠(yuǎn)程或本地服務(wù)器的用戶配置。 當(dāng)需要遠(yuǎn)程憑據(jù)時(shí),在本地時(shí)。
我們希望使用兩種不同的技術(shù)(經(jīng)典的構(gòu)建器模式和步驟構(gòu)建器模式)來(lái)抽象上述對(duì)象的構(gòu)造。
經(jīng)典的構(gòu)建器模式非常簡(jiǎn)單,它使用諸如onLocalHost,onRemoteHost等正確命名的方法來(lái)掩蓋UserConfiguration和ServerDetails的創(chuàng)建。
package com.marco.sbp.builder; import com.marco.sbp.ServerDetails; import com.marco.sbp.UserConfiguration; public class ClassicBuilder {private String name;private String host;private String user;private String password;public ClassicBuilder(String name){this.name = name;}public ClassicBuilder onLocalHost(){this.host = "localhost";return this;}public ClassicBuilder onRemoteHost(String remoteHost){this.host = remoteHost;return this;}public ClassicBuilder credentials(String user, String password){this.user = user;this.password = password;return this;}public UserConfiguration build(){UserConfiguration userConfiguration = new UserConfiguration(name);ServerDetails serverDetails = new ServerDetails(host);serverDetails.setUser(user);serverDetails.setPassword(password); ? ? ? ? ? ? ? ? ? ?userConfiguration.setServerDetails(serverDetails);return userConfiguration;} }步驟構(gòu)建器模式仍在使用智能名稱來(lái)構(gòu)造對(duì)象,但是僅在需要使用接口和適當(dāng)?shù)姆庋b時(shí)才公開(kāi)這些方法。
package com.marco.sbp.builder; import com.marco.sbp.ServerDetails; import com.marco.sbp.UserConfiguration;/** "Step Builder" */ public class StepBuilder {public static NameStep newBuilder() {return new Steps();}private StepBuilder() {}public static interface NameStep {/*** @param name* ? ? ? ? ? ?unique identifier for this User Configuration* @return ServerStep*/ServerStep name(String name);} ? ? ? public static interface ServerStep {/*** The hostname of the server where the User Configuration file is stored will be set to "localhost".* * @return BuildStep*/public BuildStep onLocalhost();/*** The hostname of the server where the User Configuration file is stored.* * @return CredentialsStep*/public CredentialsStep onRemotehost(String host);}public static interface CredentialsStep {/*** Username required to connect to remote machine Password required to connect to remote machine* * @return BuildStep*/public BuildStep credentials(String user, String password);}public static interface BuildStep {/*** @return an instance of a UserConfiguration based on the parameters passed during the creation.*/public UserConfiguration build();}private static class Steps implements NameStep, ServerStep, CredentialsStep, BuildStep {private String name;private String host;private String user;private String password;public BuildStep onLocalhost() {this.host = "localhost";return this;}public ServerStep name(String name) {this.name = name;return null;}public CredentialsStep onRemotehost(String host) {this.host = host;return this;}public BuildStep credentials(String user, String password) {this.user = user;this.password = password;return this;}public UserConfiguration build() {UserConfiguration userConfiguration = new UserConfiguration(name);ServerDetails serverDetails = new ServerDetails(host);serverDetails.setUser(user);serverDetails.setPassword(password); ? ? ? ? ? ? ? ? ? ?userConfiguration.setServerDetails(serverDetails);return userConfiguration;}} }現(xiàn)在讓我們看一下兩個(gè)構(gòu)建器的用戶體驗(yàn)。 經(jīng)典構(gòu)建器將使用用戶配置的名稱來(lái)構(gòu)造,然后它將公開(kāi)其所有方法,從而使用戶過(guò)于自由,無(wú)法選擇下一步。
例如,一個(gè)不小心的用戶可能最終將UserConfiguration設(shè)置為localhost,而無(wú)需身份驗(yàn)證,仍然傳遞用戶名和密碼。
這令人困惑,并且可能導(dǎo)致運(yùn)行時(shí)異常。
這些是用戶可以最終得到的UserConfigurations的一些可能組合,其中一些是正確的,很多是錯(cuò)誤的:
步驟構(gòu)建器有一個(gè)完全不同的故事,這里僅顯示了當(dāng)時(shí)的一個(gè)步驟:
如果不需要憑據(jù),則不會(huì)公開(kāi)它們,只有在確保對(duì)象狀態(tài)一致且完整時(shí)才提供build()方法:
使用此模式只能構(gòu)建2個(gè)可能的UserConfigurations,它們既有意義又對(duì)用戶清楚。
結(jié)論
步驟構(gòu)建器模式不是經(jīng)典Bloch 模式的替代,有時(shí)您想強(qiáng)迫用戶在進(jìn)行創(chuàng)建之前填充一些參數(shù),在這種情況下,步驟構(gòu)建器正在執(zhí)行此工作,否則,當(dāng)需要更開(kāi)放的方法時(shí)比經(jīng)典的建造者更適合您。
翻譯自: https://www.javacodegeeks.com/2013/05/building-smart-builders.html
總結(jié)
- 上一篇: 创维集团上半年:新周期下家电稳步前行,第
- 下一篇: 异步CDI事件