设计模式的理解:构造器模式(Builder Pattern)
構造器模式,將一個復雜對象的構建與其表示分離,使得同樣的構建過程可以創建不同的表示。
通俗的話來講,就是把成員變量的初始化與構造函數進行分離。
考慮到當一個類的構造函數參數個數超過4個,而且這些參數有些是可選的參數,有些參數需要she'zhi考慮使用構造者模式。
解決的問題
當一個類的構造函數參數超過4個,而且這些參數有些是可選的時,我們通常有兩種辦法來構建它的對象。 例如我們現在有如下一個類計算機類Computer,其中cpu與ram是必填參數,而其他3個是可選參數,那么我們如何構造這個類的實例呢,通常有兩種常用的方式:
第一:折疊構造函數模式(telescoping constructor pattern )
class Computer {string cpu;//必須string ram;//必須int usbCount;//可選string keyboard;//可選string display;//可選public:Computer(string cpu, string ram) {this(cpu, ram, 0);}Computer(string cpu, string ram, int usbCount) {this(cpu, ram, usbCount, "羅技鍵盤");}Computer(string cpu, string ram, int usbCount, string keyboard) {this(cpu, ram, usbCount, keyboard, "三星顯示器");}Computer(string cpu, string ram, int usbCount, string keyboard, string display) {this->cpu = cpu;this->ram = ram;this->usbCount = usbCount;this->keyboard = keyboard;this->display = display;} }雖然,在C++語言中,可以在形參中賦默認值,但是在其他語言中,上面的表達方式弊端就十分的明顯,閱讀起來不方便,操作起來也不方便,當構造函數參數超過10個以上時,你在穿參初始化時很容易把值傳錯給其他的參數。所以builder模式就產生了
一、優化的builder模式:
兩個主要的實現思路,將必須初始化的數據設置成構造函數,且構造函數不能太長,將可選的成員變量另外去賦值。
#include "iostream" using namespace std; class Computer { private:Computer() {}string cpu;//必須string ram;//必須int usbCount;//可選string keyboard;//可選string display;//可選 public: class Builder{string cpu;//必須string ram;//必須int usbCount;//可選string keyboard;//可選string display;//可選public:Builder(string cup,string ram){this->cpu=cup;this->ram=ram;}const string &getCpu() const {return cpu;}const string &getRam() const {return ram;}int getUsbCount() const {return usbCount;}const string &getKeyboard() const {return keyboard;}const string &getDisplay() const {return display;}Builder& setUsbCount(int usbCount) {this->usbCount = usbCount;return *this;}Builder& setKeyboard(string keyboard) {this->keyboard = keyboard;return *this;}Builder& setDisplay(string display) {this->display = display;return *this;}Computer * build(){return new Computer(*this);}};//省略getter方法Computer(Builder builder){this->cpu=builder.getCpu();this->ram=builder.getRam();this->usbCount=builder.getUsbCount();this->keyboard=builder.getKeyboard();this->display=builder.getDisplay();}}; int main(){Computer * computerPtr = Computer::Builder("因特爾","三星").setDisplay("三星24寸").setKeyboard("羅技").setUsbCount(2).build();return 0; }?
優化的builder省去了Director角色,而把Builder嵌套在實體類中,充當一個內部類。
二、傳統Builder 模式
?
?
最原先的builder 模式有一個director類,
1.在builder抽象類中,將實體類Product的可選成員參數的賦值設置為抽象函數,必選成員變量設置為Product實體類和 Builder派生類的構造函數。
2.Procuct 為?Builder派生類 的子對象
3.director 負責初始化??Builder。
?
1) 定義實體類
public class Computer {private String cpu;//必須private String ram;//必須private int usbCount;//可選private String keyboard;//可選private String display;//可選public Computer(String cpu, String ram) {this.cpu = cpu;this.ram = ram;}public void setUsbCount(int usbCount) {this.usbCount = usbCount;}public void setKeyboard(String keyboard) {this.keyboard = keyboard;}public void setDisplay(String display) {this.display = display;}@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", ram='" + ram + '\'' +", usbCount=" + usbCount +", keyboard='" + keyboard + '\'' +", display='" + display + '\'' +'}';} }2)抽象Builder類 和 派生類
public abstract class ComputerBuilder {public abstract void setUsbCount();public abstract void setKeyboard();public abstract void setDisplay();public abstract Computer getComputer(); }?
//蘋果電腦構建者 public class MacComputerBuilder extends ComputerBuilder {private Computer computer;public MacComputerBuilder(String cpu, String ram) {computer = new Computer(cpu, ram);}@Overridepublic void setUsbCount() {computer.setUsbCount(2);}@Overridepublic void setKeyboard() {computer.setKeyboard("蘋果鍵盤");}@Overridepublic void setDisplay() {computer.setDisplay("蘋果顯示器");}@Overridepublic Computer getComputer() {return computer;} }?
//聯想電腦構建者類 public class LenovoComputerBuilder extends ComputerBuilder {private Computer computer;public LenovoComputerBuilder(String cpu, String ram) {computer=new Computer(cpu,ram);}@Overridepublic void setUsbCount() {computer.setUsbCount(4);}@Overridepublic void setKeyboard() {computer.setKeyboard("聯想鍵盤");}@Overridepublic void setDisplay() {computer.setDisplay("聯想顯示器");}@Overridepublic Computer getComputer() {return computer;} }3) director? 類
public class ComputerDirector {public void makeComputer(ComputerBuilder builder){builder.setUsbCount();builder.setDisplay();builder.setKeyboard();} }?
使用案例:
public static void main(String[] args) {ComputerDirector director=new ComputerDirector();//1ComputerBuilder builder=new MacComputerBuilder("I5處理器","三星125");//2director.makeComputer(builder);//3Computer macComputer=builder.getComputer();//4System.out.println("mac computer:"+macComputer.toString());ComputerBuilder lenovoBuilder=new LenovoComputerBuilder("I7處理器","海力士222");director.makeComputer(lenovoBuilder);Computer lenovoComputer=lenovoBuilder.getComputer();System.out.println("lenovo computer:"+lenovoComputer.toString()); }?
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的设计模式的理解:构造器模式(Builder Pattern)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式理解:工厂模式,抽象工厂,原型方
- 下一篇: 设计模式的理解:单例模式(Singlet