網站首頁 編程語言 正文
前言
建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個復雜的對象。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。
建造者模式結構
主要由四個核心角色組建而成分別為
- 生成器(Builder):抽象產品生產步驟的方法。
- 具體生成器(Concrete Builders):產品生產步驟方法的不同的具體實現。
- 產品(Products):最終生成的對象。
- 主管:(Director)?類定義調用構造步驟的順序,?這樣你就可以創建和復用特定的產品配置。
結構類圖
實例
使用建造者模式的時候,我們應該先問問為什么要使用它?使用它能給我們帶來什么?當你考慮足夠了,使用起來才會更加順暢。下面會講解一些實例來代入我是如何理解的,也希望能幫助大家更好的理解建造者模式!
電腦在我們日常生活中是非常常見的,它的核心組成是什么呢?CPU、主板、電源、內存、硬盤等等,那么客戶端需要我們構造出來一臺電腦,我們應該如何實現呢?
static void Main(string[] args)
{
Computer computer = new Computer();
computer.SetCpu("cpu");
computer.SetMainboard("主板");
computer.SetPowerSupply("電源");
computer.SetGraphicsCard("集成顯卡");
computer.GetComputerInfo();
Console.ReadLine();
}
public class Computer
{
private string _cpu;
private string _mainboard;
private string _powerSupply;
private string _graphicsCard;
public void SetCpu(string cup)
{
_cpu = cup;
}
public void SetMainboard(string mainboard)
{
_mainboard = mainboard;
}
public void SetPowerSupply(string powerSupply)
{
_powerSupply = powerSupply;
}
public void SetGraphicsCard(string graphicsCard)
{
_graphicsCard = graphicsCard;
}
public void GetComputerInfo()
{
Console.WriteLine($"電腦配置為Cpu:{_cpu},主板為:{_mainboard},電源為:{_powerSupply},顯卡為:{_graphicsCard}");
}
}
大家都知道電腦有固態硬盤和機械硬盤之分,當然需求也各異,畢竟現在顯卡偏貴,有大多數人選擇機械硬盤,有些愛玩游戲的就需要固態硬盤,針對需求我們在構建電腦過程也會產生差異。
對于用戶來說他只需要知道他要的東西(如帶固態硬盤電腦或者機械硬盤電腦),至于你的構建過程用戶也不會太在乎。
在上述例子中客戶需要手動去Set,如果需要Set的值過多,可能會導致用戶一些關鍵屬性少賦值,并且順序也是由用戶控制的,在某些環節出現問題,就會導致電腦組裝不起來。
針對上述問題,我們可以很容易的代入建造者模式,它能將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示!
使用建造者模式
通過上面一些表述,在構建產品過程中是穩定的,而具體的構造細節是不一樣的有的需要固態硬盤,有的要機械硬盤等,那我們如何使用建造者模式呢?
// 建造者核心角色生成器
public interface IComputerBuilder
{
void SetCpu(string cup);
void SetMainboard(string mainboard);
void SetPowerSupply(string powerSupply);
void SetIsGraphicsCard(string graphicsCard);
}
// A電腦具體生成器(固態硬盤電腦)
public class AComputerBuilder : IComputerBuilder
{
private Computer Computer;
public AComputerBuilder()
{
Computer = new Computer();
}
public Computer GetComputer()
{
return Computer;
}
public void SetCpu() => Computer.Cpu = "CPU";
public void SetHardDisk() => Computer.HardDisk = "固態硬盤";
public void SetMainboard() => Computer.Mainboard = "主板";
public void SetPowerSupply() => Computer.PowerSupply = "電源";
}
// A電腦具體生成器(機械硬盤電腦)
public class BComputerBuilder : IComputerBuilder
{
private Computer Computer;
public BComputerBuilder()
{
Computer = new Computer();
}
public Computer GetComputer()
{
return Computer;
}
public void SetCpu() => Computer.Cpu = "CPU";
public void SetHardDisk() => Computer.HardDisk = "機械硬盤";
public void SetMainboard() => Computer.Mainboard = "主板";
public void SetPowerSupply() => Computer.PowerSupply = "電源";
}
- 通過了解建造者模式結構,我們需要引入主管(Director)概念類定義調用構造步驟的順序。
public class Director
{
private IComputerBuilder ComputerBuilder;
//客戶端代碼會創建生成器對象并將其傳遞給主管,然后執行構造過程。
public Director(IComputerBuilder _ComputerBuilder)
{
ComputerBuilder = _ComputerBuilder;
}
public Computer Build()
{
ComputerBuilder.SetCpu();
ComputerBuilder.SetMainboard();
ComputerBuilder.SetPowerSupply();
ComputerBuilder.SetHardDisk();
return ComputerBuilder.GetComputer();
}
}
- 執行結果
總結
使用建造者模式,可以將項目中復雜的構建邏輯提取出來,并且可以分布構建。電腦這個產品的組成是一些固定的硬件,變得只是這些具體的硬件,比如需要構建500W電源的電腦亦或者是750W的電腦,只需要繼承IComputerBuilder實現即可(可擴展性)。
但是如果內部復雜,可能會產生非常多的建造者類,無疑會產生非常多的類,代碼復雜度提高了。注意: 當具體建造者只有一個的時候,主管(Director)完全可以省略掉。
原文鏈接:https://juejin.cn/post/7132034788609196046
相關推薦
- 2022-08-16 C/C++函數的調用約定的使用_C 語言
- 2023-12-20 Mybatis中resultMap結果集的使用
- 2022-07-14 C++深入探索類和對象之封裝及class與struct的區別_C 語言
- 2022-04-03 Python中的tkinter庫簡單案例詳解_python
- 2022-09-30 C#?使用com獲取Windows攝像頭列表_C#教程
- 2023-02-03 Python3.10?Generator生成器Coroutine原生協程詳解_python
- 2022-05-18 Jenkins使用publish?html?report插件展示HTML報告的方法_相關技巧
- 2022-03-23 C語言實現簡單的三子棋游戲源碼_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支