日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式的理解:构造器模式(Builder Pattern)

發(fā)布時(shí)間:2024/10/14 asp.net 143 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式的理解:构造器模式(Builder Pattern) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

構(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。