3.1 建造者模式(Builder)
例子:根據計算機組件組裝不同的計算機。
用這個例子來理解一下創建者模式:首先這個模式做的事情是這樣的,現在有一堆計算機零件,比如說一塊硬盤它可以放在筆記本電腦上也可以放在台式機上,那么建造者模式就是把不同電腦的構建和表示分離,提供一個計算機產品類,里面包含了計算機的零件,之后提供一張“圖紙”這張圖紙就是一個抽象建造者接口,這個接口提供了創建的方法以及返回復雜對象的方法,具體的建造者會實現這個接口,用這張“圖紙”來創造不同類型的計算機。
具體角色:
- 具體產品角色:Computer
- 抽象建造者:ComputerBuilder
- 具體建造者:DeskTopComputer、LapTopComputer
- 指揮者:ComputerWaiter
注意點:
-
抽象建造者里要去new一個具體產品。 protected Computer computer = new Computer(); 抽象建造者里需要定義一個返回復雜產品的方法 public Computer getComputer(){ return computer; } 具體建造者繼承自抽象建造者,實現里面的所有建造方法! public class DeskTopBuilder extends ComputerBuilder 指揮者類是真正干活的類 public class ComputerWaiter { private ComputerBuilder cb; public void setCb(ComputerBuilder cb){ this.cb=cb; } public Computer construct(){ cb.buildCPU(); cb.buildHardDisk(); cb.buildMainFrame(); cb.buildMemory(); return cb.getComputer(); } } 這個類需要擁有一個抽象建造者的對象,利用這個對象調用其建造的方法來完整一個具體的產品並調用其方法把這個產品返回!
總結:
- 具體產品類提供了一個產品需要的零件。
- 抽象建造類相當於是總工程師畫的一張圖紙,這張圖紙總體上實現了這個產品的建造,里面需要一個創建(new)一個具體產品的成員對象,並提供返回這個對象的方法。
- 具體建造類相當於是拿着總工程師的圖紙根據實際的需要進行了二次加工,這個類繼承自抽象建造類,需要實現總圖紙的所有方法,不過具體的建造細節可以自己決定。
- 指揮者類是真正干活的工人,這個類拿着實際的圖紙來完成工作做出具體的產品,這個類需要聚合抽象建造類,並提供setter接口方法,讓外界傳入具體的“圖紙”參數,然后進行建造。
核心理解
建造者模式的核心在於抽象建造者類,這個類要做的事情是定義方法:首先這個類是用來建造一個實例對象的,所以一定要new一個新的產品對象作為其屬性成員,然后定義建造的接口方法,根據具體需要被建造的實例的setter方法提供不同的多個建造方法接口,最后需要一個方法返回最終建造完成的對象。
這個抽象建造方法就是一張建造的圖紙,后面實現這個接口的類是具體的建造圖紙,把具體的建造圖紙用set注入的方式給指揮者類(相當於工人)讓指揮者類干活,最后根據具體圖紙完成一個實例產品!