建造者模式:是將一個複雜的對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。java
工廠類模式提供的是建立單個類的模式,而建造者模式則是將各類產品集中起來進行管理,用來建立複合對象,所謂複合對象就是指某個類具備不一樣的屬性,其實建造者模式就是前面抽象工廠模式和最後的Test結合起來獲得的。算法
建造者模式一般包括下面幾個角色:segmentfault
使用場景:數組
與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。ide
public class Person { private String head; private String body; private String foot; public String getHead() { return head; } public void setHead(String head) { this.head = head; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getFoot() { return foot; } public void setFoot(String foot) { this.foot = foot; } }
public interface PersonBuilder { void builderHead(); void builderBody(); void builderFoot(); Person BuilderPersion(); //組裝 }
public class ManBuilder implements PersonBuilder { private Person person; public ManBuilder() { person = new Person();//建立一個Person實例,用於調用set方法 } public void builderHead() { person.setHead("建造者頭部分"); } public void builderBody() { person.setBody("建造者身體部分"); } public void builderFoot() { person.setFoot("建造者頭四肢部分"); } public Person BuilderPersion() { return person; } }
public class PersonDirector { public Person constructPerson(PersonBuilder pb) { pb.builderHead(); pb.builderBody(); pb.builderFoot(); return pb.BuilderPersion(); } public static void main(String[] args) { PersonDirector pb = new PersonDirector(); Person person = pb.constructPerson(new ManBuilder()); System.out.println(person.getHead()); System.out.println(person.getBody()); System.out.println(person.getFoot()); } }
定義一個操做中的算法骨架,而將一些步驟延遲到子類中。模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的測試
重複代碼所有在父類裏面,不一樣業務的,抽取給子類進行實現。抽取過程---抽象方法。ui
某些特定步驟。this
核心:處理某個流程的代碼已經都具有,可是其中某個節點的代碼暫時不能肯定。所以,咱們採用工廠方法模式,將這個節點的代碼實現轉移給
子類完成。即:處理步驟在父類中定義好,具體的實現延遲到子類中定義。lua
說白了,就是將一些相同操做的代碼,封裝成一個算法的骨架。核心的部分留在子類中操做,在父類中只把那些骨架作好。
例如:
例如:spa
這裏辦理業務是屬於子類來完成的,其餘的取號,排隊,評分則是一個模板。
這裏吃飯是屬於子類來完成的,其餘的點餐,買單則是餐廳提供給咱們客戶的一個模板。
這裏使用銀行辦理業務爲例
//模板方法 public abstract class BankTemplateMethod { // 1.取號排隊 public void takeNumber() { System.out.println("取號排隊。。"); } // 2.每一個子類不一樣的業務實現,由各自子類實現. abstract void transact(); // 3.評價 public void evaluate() { System.out.println("反饋評價.."); } public void process(){ takeNumber(); transact(); evaluate(); } }
public class DrawMoney extends BankTemplateMethod { @Override void transact() { System.out.println("我要取款"); } }
public class Client { public static void main(String[] args) { BankTemplateMethod bankTemplate=new DrawMoney(); bankTemplate.process(); } }
BankTemplateMethod bankTemplateMethod=new BankTemplateMethod() { @Override void transact() { System.out.println("我要存錢."); } }; bankTemplateMethod.process();
我的博客 蝸牛