建造者模式
建造者模式的核心思想是將一個"復雜對象的構建算法"與它的"部件及組裝方式"分離,使得構件算法和組裝方式可以獨立應對變化;復用同樣的構建算法可以創建不同的表示,不同的構建過程可以復用相同的部件組裝方式。
好吧,我承認上面那句話是Baidu來的,要是能很容易的明白講的是什么,請切換到漫游模式繼續漫游吧。
下面我們不聊這些模式了,繼續聊我們的實驗室,因為模式不發給我們工資,實驗室才是發工資的。
最近我們的實驗室又遇到麻煩了,老總們即使能夠同時使用女秘書了也忍不住發火了,因為趕太陽國一大筆獸人訂單,到交付的時候才發現,大都數獸人沒有頭,沒有頭的獸人能叫獸人嗎?那只能叫無頭獸!
class ShouRen { private String head; private String body; private String foot; public void setHead(String head) { this.head = head; } public void setBody(String body) { this.body = body; } public void setFoot(String foot) { this.foot = foot; } } public class Builder { public static void main(String[] args) { ShouRen sr = new ShouRen(); sr.setBody("獸身"); sr.setFoot("獸腳"); } }
為了解決這種浪費材料的問題再次發生,我們實驗室又開了大會,某位管理層說這是因為獸人分廠建設在太陽國的原因,當地的土著完全不理解我們獸人工廠生產獸人時的步驟,所以才會有這個問題,所以要加大獸人員工的培訓,讓他們的技能和我們人類工廠的員工達到一致水平。老總們一聽,立即暴怒,不說培訓獸人員工的費用問題(其實就是我們coding時了解其他類的接口花費的時間),就獸人的智商,即使培訓了也不一定有效果(coding時面對一個上千行的類,實在是提不起興致過一遍 -_-! )。
這時有是我們的資深顧問說,既然這樣,我們就不要讓員工自己創建獸人了,我們給他們發一個獸人創建器,他們只要把原料放到創建器里面自動就出來一個獸人好了。
class ShouRen { private String head; private String body; private String foot; public void setHead(String head) { this.head = head; } public void setBody(String body) { this.body = body; } public void setFoot(String foot) { this.foot = foot; } } class ShouRenBuilder { ShouRen sr; public ShouRenBuilder (){ sr = new ShouRen(); } public void createHead() { sr.setHead("獸頭"); } public void createBody() { sr.setBody("獸身"); } public void createFoot() { sr.setFoot("獸腳"); } public ShouRen createShouRen() { createHead(); createBody(); createFoot(); return sr; } } public class Builder { public static void main(String[] args) { ShouRen sr = new ShouRenBuilder().createShouRen(); } }
老總一看這個方法不錯,大肆贊賞,並且希望擴大使用范圍,希望我們的正常人工廠和人妖工廠也使用這種構造器。
class Ren { } class NanRen extends Ren { private String head; private String body; private String foot; public void setHead(String head) { this.head = head; } public void setBody(String body) { this.body = body; } public void setFoot(String foot) { this.foot = foot; } } class NvRen extends Ren { private String head; private String body; private String foot; public void setHead(String head) { this.head = head; } public void setBody(String body) { this.body = body; } public void setFoot(String foot) { this.foot = foot; } } class RenYao extends Ren { private String head; private String body; private String foot; public void setHead(String head) { this.head = head; } public void setBody(String body) { this.body = body; } public void setFoot(String foot) { this.foot = foot; } } class ShouRen extends Ren { private String head; private String body; private String foot; public void setHead(String head) { this.head = head; } public void setBody(String body) { this.body = body; } public void setFoot(String foot) { this.foot = foot; } } class NanRenBuilder { NanRen nr; public NanRenBuilder (){ nr = new NanRen(); } public void createHead() { nr.setHead("男人頭"); } public void createBody() { nr.setBody("男人身"); } public void createFoot() { nr.setFoot("男人腳"); } public NanRen createNanRen() { createHead(); createBody(); createFoot(); return nr; } } class NvRenBuilder { NvRen nr; public NvRenBuilder (){ nr = new NvRen(); } public void createHead() { nr.setHead("女人頭"); } public void createBody() { nr.setBody("女人身"); } public void createFoot() { nr.setFoot("女人腳"); } public NvRen createNvRen() { createHead(); createBody(); createFoot(); return nr; } } class RenYaoBuilder { RenYao ry; public RenYaoBuilder (){ ry = new RenYao(); } public void createHead() { ry.setHead("人妖頭"); } public void createBody() { ry.setBody("人妖身"); } public void createFoot() { ry.setFoot("人妖腳"); } public RenYao createRenYao() { createHead(); createBody(); createFoot(); return ry; } } class ShouRenBuilder { ShouRen sr; public ShouRenBuilder (){ sr = new ShouRen(); } public void createHead() { sr.setHead("獸頭"); } public void createBody() { sr.setBody("獸身"); } public void createFoot() { sr.setFoot("獸腳"); } public ShouRen createShouRen() { createHead(); createBody(); createFoot(); return sr; } }
這時財務科的人發表意見了,如果我們的各大工廠都使用構造器的話,確實能省下不少工人的培訓費用,但是硬件成本會加大不少阿(即重復代碼),並且提出,我們的生產流程是一樣的,都是先創建頭,再創建身體,最后創建腳。
所以我們把組裝的工作弄出一個組裝器,然后要生產不同的人的時候仿佛不同的構造器,那么我們原先放在構造器中的組裝步驟就能夠重用了。於是我們就不知不覺的用上了建造者模式來生產。
class Ren { } class NanRen extends Ren { private String head; private String body; private String foot; public void setHead(String head) { this.head = head; } public void setBody(String body) { this.body = body; } public void setFoot(String foot) { this.foot = foot; } } class NvRen extends Ren { private String head; private String body; private String foot; public void setHead(String head) { this.head = head; } public void setBody(String body) { this.body = body; } public void setFoot(String foot) { this.foot = foot; } } class RenYao extends Ren { private String head; private String body; private String foot; public void setHead(String head) { this.head = head; } public void setBody(String body) { this.body = body; } public void setFoot(String foot) { this.foot = foot; } } class ShouRen extends Ren { private String head; private String body; private String foot; public void setHead(String head) { this.head = head; } public void setBody(String body) { this.body = body; } public void setFoot(String foot) { this.foot = foot; } } interface RenBuilder { public abstract void createHead(); public abstract void createBody(); public abstract void createFoot(); public abstract Ren getRen(); } class NanRenBuilder implements RenBuilder{ NanRen nr; public NanRenBuilder (){ nr = new NanRen(); } public void createHead() { nr.setHead("男人頭"); } public void createBody() { nr.setBody("男人身"); } public void createFoot() { nr.setFoot("男人腳"); } public Ren getRen() { return nr; } } class NvRenBuilder implements RenBuilder{ NvRen nr; public NvRenBuilder (){ nr = new NvRen(); } public void createHead() { nr.setHead("女人頭"); } public void createBody() { nr.setBody("女人身"); } public void createFoot() { nr.setFoot("女人腳"); } public Ren getRen() { return nr; } } class RenYaoBuilder implements RenBuilder{ RenYao ry; public RenYaoBuilder (){ ry = new RenYao(); } public void createHead() { ry.setHead("人妖頭"); } public void createBody() { ry.setBody("人妖身"); } public void createFoot() { ry.setFoot("人妖腳"); } public Ren getRen() { return ry; } } class ShouRenBuilder implements RenBuilder{ ShouRen sr; public ShouRenBuilder (){ sr = new ShouRen(); } public void createHead() { sr.setHead("獸頭"); } public void createBody() { sr.setBody("獸身"); } public void createFoot() { sr.setFoot("獸腳"); } public Ren getRen() { return sr; } } class RenDirector{ public Ren create(RenBuilder builder) { builder.createHead(); builder.createBody(); builder.createFoot(); return builder.getRen(); } } public class Builder { public static void main(String[] args) { ShouRenBuilder srBuilder = new ShouRenBuilder();//獸人建造核心 NanRenBuilder nanrBuilder = new NanRenBuilder();//男人建造核心 NvRenBuilder nvrBuilder = new NvRenBuilder();//女人建造核心 RenYaoBuilder ryBuilder = new RenYaoBuilder();//人妖建造核心 RenDirector rd = new RenDirector();//只有一個組裝器,裝上不同的建造核心,就能建出不同的人。 Ren sr = rd.create(srBuilder); Ren nanren = rd.create(nanrBuilder); Ren nvren = rd.create(nvrBuilder); Ren ry = rd.create(ryBuilder); } }
至此,創建型的五種設計模式就舉例完了。后面的坑慢慢填。