设计模式的理解:构造器模式(Builder Pattern)
構(gòu)造器模式,將一個(gè)復(fù)雜對象的構(gòu)建與其表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
通俗的話來講,就是把成員變量的初始化與構(gòu)造函數(shù)進(jìn)行分離。
考慮到當(dāng)一個(gè)類的構(gòu)造函數(shù)參數(shù)個(gè)數(shù)超過4個(gè),而且這些參數(shù)有些是可選的參數(shù),有些參數(shù)需要she'zhi考慮使用構(gòu)造者模式。
解決的問題
當(dāng)一個(gè)類的構(gòu)造函數(shù)參數(shù)超過4個(gè),而且這些參數(shù)有些是可選的時(shí),我們通常有兩種辦法來構(gòu)建它的對象。 例如我們現(xiàn)在有如下一個(gè)類計(jì)算機(jī)類Computer,其中cpu與ram是必填參數(shù),而其他3個(gè)是可選參數(shù),那么我們?nèi)绾螛?gòu)造這個(gè)類的實(shí)例呢,通常有兩種常用的方式:
第一:折疊構(gòu)造函數(shù)模式(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++語言中,可以在形參中賦默認(rèn)值,但是在其他語言中,上面的表達(dá)方式弊端就十分的明顯,閱讀起來不方便,操作起來也不方便,當(dāng)構(gòu)造函數(shù)參數(shù)超過10個(gè)以上時(shí),你在穿參初始化時(shí)很容易把值傳錯(cuò)給其他的參數(shù)。所以builder模式就產(chǎn)生了
一、優(yōu)化的builder模式:
兩個(gè)主要的實(shí)現(xiàn)思路,將必須初始化的數(shù)據(jù)設(shè)置成構(gòu)造函數(shù),且構(gòu)造函數(shù)不能太長,將可選的成員變量另外去賦值。
#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; }?
優(yōu)化的builder省去了Director角色,而把Builder嵌套在實(shí)體類中,充當(dāng)一個(gè)內(nèi)部類。
二、傳統(tǒng)Builder 模式
?
?
最原先的builder 模式有一個(gè)director類,
1.在builder抽象類中,將實(shí)體類Product的可選成員參數(shù)的賦值設(shè)置為抽象函數(shù),必選成員變量設(shè)置為Product實(shí)體類和 Builder派生類的構(gòu)造函數(shù)。
2.Procuct 為?Builder派生類 的子對象
3.director 負(fù)責(zé)初始化??Builder。
?
1) 定義實(shí)體類
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(); }?
//蘋果電腦構(gòu)建者 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;} }?
//聯(lián)想電腦構(gòu)建者類 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("聯(lián)想鍵盤");}@Overridepublic void setDisplay() {computer.setDisplay("聯(lián)想顯示器");}@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位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的设计模式的理解:构造器模式(Builder Pattern)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式理解:工厂模式,抽象工厂,原型方
- 下一篇: 设计模式的理解:单例模式(Singlet