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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

设计模式 之美 -- 建造者模式

發(fā)布時(shí)間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式 之美 -- 建造者模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

        • 1. 解決問題
        • 2. 應(yīng)用場景
        • 3. 實(shí)現(xiàn)
          • C語言實(shí)現(xiàn)
          • C++實(shí)現(xiàn)
        • 4. 缺點(diǎn)

1. 解決問題

描述如下場景:

  • 類的數(shù)據(jù)成員很多(8個(gè)以上),當(dāng)我們進(jìn)行初始化的時(shí)候放在初始化列表中,影響類的可讀性,同時(shí)校驗(yàn)初始化參數(shù)列表是否有效的邏輯也無處放置
  • 假如初始化列表中的參數(shù)有一定的依賴關(guān)系,比如數(shù)據(jù)成員max 一定比 數(shù)據(jù)成員min 小才行,這樣的依賴關(guān)系設(shè)置邏輯無處安放(需要在類實(shí)例化的時(shí)候就要完成依賴關(guān)系的創(chuàng)建)
  • 類的對(duì)象是不可變的,也就是對(duì)象在創(chuàng)建好之后就不能再修改其內(nèi)部的屬性值。此時(shí),我們不能對(duì)外暴露類的set成員函數(shù)。

針對(duì)以上三種關(guān)于 類實(shí)例化過程中遇到 的問題,我們可以使用建造者模式 解決。

2. 應(yīng)用場景

  • 一種類的設(shè)計(jì)較為復(fù)雜,需要通過設(shè)置不同的可選錯(cuò)參數(shù),定制化地創(chuàng)建不同的對(duì)象

建造者模式和工廠模式的區(qū)別:

工廠模式:創(chuàng)建擁有相關(guān)性的不同對(duì)象(繼承同一父類或者接口的子類),由給定的參數(shù)來決定創(chuàng)建哪一種類的對(duì)象

建造者模式:創(chuàng)建一種類型的復(fù)雜對(duì)象,通過設(shè)置不同的可選參數(shù),“定制化”地創(chuàng)建不同的對(duì)象

舉例:

顧客走進(jìn)餐館點(diǎn)餐,我們使用工廠模式 根據(jù)用戶的不同選擇,制作不同的食物:漢堡,沙拉,披薩等。

對(duì)于披薩來說,用戶可以有不同的配料選擇:奶酪,西紅柿,起司。此時(shí)我們通過建造者模式根據(jù)用戶選擇的不同配料制作披薩。

3. 實(shí)現(xiàn)

C語言實(shí)現(xiàn)

實(shí)現(xiàn)功能:

建造者模式實(shí)現(xiàn)簡單的電腦組裝,通過配置不同的config來組裝出不同用戶要求的電腦(穩(wěn)定性高、性能高)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct PERSONAL_COMPUTER {char cpu[20];char memory[20];char harddisk[20];
}Personal_Computer;void assemble_intel_cpu(Personal_Computer* personal_computer)
{strncpy(personal_computer->cpu, "inter",sizeof("inter"));return;
}
void assemble_amd_cpu(Personal_Computer* personal_computer)
{strncpy(personal_computer->cpu, "amd", sizeof("amd"));return;
}
void assemble_samsung_memory(Personal_Computer* personal_computer)
{strncpy(personal_computer->memory,"samsung", sizeof("samsung"));return;
}
void assemble_kingston_memory(Personal_Computer* personal_computer)
{strncpy(personal_computer->memory, "kingston", sizeof("kingston"));return;
}
void assemble_hitachi_harddisk(Personal_Computer* personal_computer)
{strncpy(personal_computer->harddisk, "hitachi", sizeof("hitachi"));return;
}
void assemble_digital_harddisk(Personal_Computer* personal_computer)
{strncpy(personal_computer->harddisk, "digital", sizeof("digital"));return;
}struct PERSONAL_COMPUTER* builder_fast_config()
{struct PERSONAL_COMPUTER *Personal_Computer = NULL;Personal_Computer = (struct PERSONAL_COMPUTER*)malloc(sizeof(struct PERSONAL_COMPUTER));if (Personal_Computer == NULL) {return NULL;}assemble_intel_cpu(Personal_Computer);assemble_hitachi_harddisk(Personal_Computer);assemble_kingston_memory(Personal_Computer);return Personal_Computer;
}struct PERSONAL_COMPUTER* builder_safty_config()
{struct PERSONAL_COMPUTER* personal_computer = NULL;personal_computer = (struct PERSONAL_COMPUTER*)malloc(sizeof(struct PERSONAL_COMPUTER));if (personal_computer == NULL) {return NULL;}assemble_amd_cpu(personal_computer);assemble_digital_harddisk(personal_computer);assemble_samsung_memory(personal_computer);return personal_computer;
}int main()
{struct PERSONAL_COMPUTER* my_personal_computer = NULL;printf("safy style is :\n");my_personal_computer = builder_safty_config();printf("cpu: %s\n", my_personal_computer->cpu);printf("memory: %s\n", my_personal_computer->memory);printf("harddisk: %s\n", my_personal_computer->harddisk);printf("fast style is :\n");my_personal_computer = builder_fast_config();printf("cpu: %s\n", my_personal_computer->cpu);printf("memory: %s\n", my_personal_computer->memory);printf("harddisk: %s\n", my_personal_computer->harddisk);if (my_personal_computer != NULL) {free(my_personal_computer);}return 0;
}

輸出如下:

safy style is :
cpu: amd
memory: samsung
harddisk: digital
fast style is :
cpu: inter
memory: kingston
harddisk: hitachi
C++實(shí)現(xiàn)

實(shí)現(xiàn)功能:

建造者負(fù)責(zé)根據(jù)product 類的初始化成員列表,構(gòu)造不同需求的product對(duì)象,同時(shí)滿足product類的成員有效性的校驗(yàn)。

#include <iostream>
#include <string>using namespace std;class Product{
private:string name;int max;int min;int total;/*構(gòu)造函數(shù)聲明為private,可以保證該類實(shí)例化無法再外部進(jìn)行,只能由類內(nèi)部自己進(jìn)行*/Product(Builder builder) { (*this).name = builder.name;(*this).max = builder.max;(*this).min = builder.min;(*this).total = builder.total;}public:string getName() {return (*this).name;}int getMax() {return (*this).max;}int getMin() {return (*this).min;}int getTotal() {return (*this).total;}/*builder類設(shè)計(jì)成了Product的內(nèi)部類,這里也可以設(shè)計(jì)Builer類為獨(dú)立的非內(nèi)部類*/static class Builder {private:const static int DEFAULT_MAX = 8;const static int DEFAULT_TOTAL = 8;const static int DEFAULT_MIN = 0;string name;int max = DEFAULT_MAX;int total = DEFAULT_TOTAL;int min = DEFAULT_MIN;public:/*這里進(jìn)行Product類初始化成員的校驗(yàn)邏輯,包括必填校驗(yàn)項(xiàng)、依賴關(guān)系校驗(yàn)、約束條件等*/Product build(){if(name==""){throw "name is null!";}if(max > total) {throw "max bigger than total!"}if(max < min) {throw "max less than min!"}return new Product((*this));}/*設(shè)置名字*/Builder setName(string name) {if(name == "") {throw "name is null, illegal!";}(*this).name = name;return (*this);}/*設(shè)置最大值*/Builder setMax(int max) {if(max < 0) {throw "max is less than zero, illegal!";}(*this).max = max;return (*this);} /*設(shè)置總值*/Builder setTotal(int name) {if(total <= 0) {throw "total is less than zero, illegal!";}(*this).total = total;return (*this);}/*設(shè)置最小值*/Builder setMin(int min) {if(min < 0) {throw "min is less than zero, illegal!";}(*this).min = min;return (*this);}};
};int main(){Product product = new Product.Builder().setName("productA").setMax(16).setTotal(2).setMin(0).build();cout << "After product construct:"<< "name:" << product.getName() << endl<< "total:" << product.getTotal() << endl<< "max:" << product.getMax() << endl<< "min:" << product.getMin() << endl;return 0;
}

4. 缺點(diǎn)

  • 工廠模式:創(chuàng)建擁有相關(guān)性的不同對(duì)象(繼承同一父類或者接口的子類),由給定的參數(shù)來決定創(chuàng)建哪一種類的對(duì)象

  • 建造者模式:創(chuàng)建一種類型的復(fù)雜對(duì)象,通過設(shè)置不同的可選參數(shù),“定制化”地創(chuàng)建不同的對(duì)象。

綜上,建造者模式僅僅是為了適配不同需求的對(duì)象,并不負(fù)責(zé)之后對(duì)象的處理;工廠模式則主要是針對(duì)接口開發(fā),通過創(chuàng)建擁有相關(guān)性的不同對(duì)象來進(jìn)行不同的操作。

總結(jié)

以上是生活随笔為你收集整理的设计模式 之美 -- 建造者模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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