設(shè)計(jì)模式----建造者模式

引用了

https://blog.csdn.net/top_code/article/details/41894351
https://blog.csdn.net/top_code/article/details/51841552

用途

用于解決以下這種情況,參數(shù)很多,但是并不是都需要窒舟,①于是你選擇寫(xiě)出很多構(gòu)造函數(shù)衡载,②或者一次性讓使用者輸入很多參數(shù),這些參數(shù)中很多為null。③這個(gè)時(shí)候就需要建造者builder模式。
public class Person {
    private final String firstName;
    private final String lastName;
    private final String middleName;
    private final int age;
    private final String street;
    private final String district;
    private final String city;
    private final String province;
    private final boolean isFemale;
    private final boolean isEmployed;

    public Person(String firstName, String lastName, String middleName, int age, String street,
                  String district, String city, String province, boolean isFemale, boolean isEmployed) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.middleName = middleName;
        this.age = age;
        this.street = street;
        this.district = district;
        this.city = city;
        this.province = province;
        this.isFemale = isFemale;
        this.isEmployed = isEmployed;
    }

    @Override
    public String toString() {
        return "Person{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", middleName='" + middleName + '\'' +
                ", age=" + age +
                ", street='" + street + '\'' +
                ", district='" + district + '\'' +
                ", city='" + city + '\'' +
                ", province='" + province + '\'' +
                ", isFemale=" + isFemale +
                ", isEmployed=" + isEmployed +
                '}';
    }
}

代碼示例

HttpClient_4.3中部分源碼

/**
 * builder pattern
 * @author Ricky Feng
 * @version 2015-02-27 10:42
 */
public class IvrConfig {
    private final String apiKey;
    private final String secret;
    private final int interval;
    private final File ivrFileDir;
    
    IvrConfig(final String apiKey,final String secret,final int interval,final File ivrFileDir){
        this.apiKey = apiKey;
        this.secret = secret;
        this.interval = interval;
        this.ivrFileDir = ivrFileDir;
    }
    
    public String getApiKey() {
        return apiKey;
    }
 
    public String getSecret() {
        return secret;
    }
 
    public int getInterval() {
        return interval;
    }
 
    public File getIvrFileDir() {
        return ivrFileDir;
    }
    
    /**create Builder method**/
    public static IvrConfig.Builder custom() {
        return new Builder();
    }
    
    @Override
    public String toString() {
        return "IvrConfig [apiKey=" + apiKey + ", secret=" + secret
                + ", interval=" + interval + ", ivrFileDir=" + ivrFileDir + "]";
    }
 
    
    public static class Builder {
        private String apiKey;
        private String secret;
        private int interval;
        private File ivrFileDir;
        
        Builder(){
            this.apiKey = "null";
            this.secret = "null";
            this.interval = -1;
            this.ivrFileDir = new File("./");
        }
        
        public Builder setApiKey(final String apiKey) {
            this.apiKey = apiKey;
            return this;
        }
        
        public Builder setSecret(final String secret) {
            this.secret = secret;
            return this;
        }
        
        public Builder setinterval(final int interval) {
            this.interval = interval;
            return this;
        }
        
        public Builder setIvrFileDir(final File ivrFileDir) {
            this.ivrFileDir = ivrFileDir;
            return this;
        }
        
        public IvrConfig build(){
            
            return new IvrConfig(apiKey, secret, interval, ivrFileDir);
        }
    }
    
}
IvrConfig config = IvrConfig.custom().setApiKey("abc").setSecret("bb").build();
        
        System.out.println(config);

另外一種寫(xiě)法

public class PermissionAsker {

    private Activity activity;//activity
    private Fragment fragment;//fragment
    private OnAskAppearListener listener;//申請(qǐng)權(quán)限時(shí)要執(zhí)行的事件
    private String[] permissions;//權(quán)限
    private int permissionCode;//權(quán)限申請(qǐng)碼,不同權(quán)限憎茂,不能沖突
    private int activityCode;//設(shè)置界面權(quán)限申請(qǐng)碼,不同權(quán)限不能沖突
    private String askReason;//權(quán)限跳轉(zhuǎn)提示語(yǔ)句
    private boolean must;

    private AlertDialog alertDialog;

    private boolean isAsking;

    /**
     * 構(gòu)造一個(gè)asker
     * @param activity activity
     * @param listener 申請(qǐng)權(quán)限時(shí)要執(zhí)行的事件
     * @param permisstions 權(quán)限
     * @param permissionCode 權(quán)限申請(qǐng)的requestCode
     * @param activityCode 跳轉(zhuǎn)到設(shè)置界面的requestCode
     * @param askReason 是否彈出dialog跳轉(zhuǎn)到權(quán)限設(shè)置
     */
    public PermissionAsker(Activity activity, Fragment fragment, OnAskAppearListener listener, String[] permisstions, int permissionCode, int activityCode, String askReason, boolean must){
        this.activity = activity;
        this.fragment = fragment;
        this.listener = listener;
        this.permissions = permisstions;
        this.permissionCode = permissionCode;
        this.activityCode = activityCode;
        this.askReason = askReason;
        this.must = must;
    }


    public static class Builder{
        private Activity activity;
        private Fragment fragment;
        private OnAskAppearListener listener;
        private String[] permissions;
        private int permisstionCode;
        private int activityCode;
        private String askReason;
        private boolean must;

        public Builder(){
        }

        public Builder setActivity(Activity activity) {
            this.activity = activity;
            return this;
        }

        public Builder setFragment(Fragment fragment){
            this.fragment = fragment;
            return this;
        }

        public Builder setListener(OnAskAppearListener listener) {
            this.listener = listener;
            return this;
        }

        public Builder setPermissions(String[] permissions) {
            this.permissions = permissions;
            return this;
        }

        public Builder setPermisstionCode(int permisstionCode) {
            this.permisstionCode = permisstionCode;
            return this;
        }

        public Builder setActivityCode(int activityCode) {
            this.activityCode = activityCode;
            return this;
        }

        public Builder setAskReason(String askReason) {
            this.askReason = askReason;
            return this;
        }

        public Builder setMust(boolean must){
            this.must = must;
            return this;
        }

        public PermissionAsker build(){
            return new PermissionAsker(activity, fragment, listener, permissions, permisstionCode, activityCode, askReason, must);
        }
    }
}
initAsker = new PermissionAsker.Builder()
                .setActivity(this)
                .setActivityCode(2)
                .setPermisstionCode(2)
                .setAskReason("為了測(cè)試锤岸,我們需要你的這些權(quán)限")
                .setPermissions( new String[]{
                        Manifest.permission.RECORD_AUDIO,
                        Manifest.permission.CAMERA
                })
                .setMust(true)
                .setListener(new OnAskAppearListener() {
                    @Override
                    public void onAppear() {
                        Toast.makeText(MainActivity.this, "成功啦", Toast.LENGTH_SHORT).show();
                    }
                })
                .build();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末竖幔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子是偷,更是在濱河造成了極大的恐慌拳氢,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛋铆,死亡現(xiàn)場(chǎng)離奇詭異馋评,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)刺啦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)留特,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人玛瘸,你說(shuō)我怎么就攤上這事蜕青。” “怎么了糊渊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵右核,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我渺绒,道長(zhǎng)贺喝,這世上最難降的妖魔是什么磷瘤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮搜变,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘针炉。我一直安慰自己挠他,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布篡帕。 她就那樣靜靜地躺著殖侵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪镰烧。 梳的紋絲不亂的頭發(fā)上拢军,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音怔鳖,去河邊找鬼茉唉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛结执,可吹牛的內(nèi)容都是我干的度陆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼献幔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼懂傀!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蜡感,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蹬蚁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后郑兴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體犀斋,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年情连,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闪水。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒙具,死狀恐怖球榆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情禁筏,我是刑警寧澤持钉,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站篱昔,受9級(jí)特大地震影響每强,放射性物質(zhì)發(fā)生泄漏始腾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一空执、第九天 我趴在偏房一處隱蔽的房頂上張望浪箭。 院中可真熱鬧,春花似錦辨绊、人聲如沸奶栖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宣鄙。三九已至,卻和暖如春默蚌,著一層夾襖步出監(jiān)牢的瞬間冻晤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工绸吸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鼻弧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓锦茁,卻偏偏與公主長(zhǎng)得像温数,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜻势,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容