# 前言 這次是這系列的第9篇 主題是建造者模式(Builder Pattern) # 建造者模式 一種創建型設計模式,它將一個複雜物件的構造過程與其表示分離,使得同樣的構建過程可以創建不同的表示。 建造者模式特別適合用於創建包含多種屬性或配置的複雜對象,並且允許對創建過程進行更靈活的控制。 建造者模式結構 1. 產品(Product): 要創建的複雜物件,它包含了多個屬性。建造者模式的目標就是構建這個產品。 2. 建造者(Builder): 定義構建產品的各個部分的接口。不同的具體建造者可以實現這個接口,按照不同的配置創建產品。 3. 具體建造者(Concrete Builder): 實現 Builder 接口,具體執行各部分的構建方法。每個具體建造者可以創建不同的產品表示。 4. 指揮者(Director) 控制建造過程的類別。指揮者決定建造的步驟和順序,並調用建造者執行具體的構建操作。 這次的情境是買電腦 依照使用需求的不同,你會需要不同規格的電腦 你可能懶得自己研究如何組電腦,所以你想選擇套裝機 接著上程式 ```python= from abc import ABC, abstractmethod class Computer(): # Product def __init__(self) -> None: self.cpu = None self.ram = None self.gpu = None self.disk = None self.power = None self.mb = None def __str__(self) -> str: return f"Computer(cpu={self.cpu}, ram={self.ram}, gpu={self.gpu}, disk={self.disk}, power={self.power}, mb={self.mb})" class ComputerParts(ABC): # Builder @abstractmethod def set_cpu(self): pass @abstractmethod def set_ram(self): pass @abstractmethod def set_gpu(self): pass @abstractmethod def set_disk(self): pass @abstractmethod def set_power(self): pass @abstractmethod def set_mb(self): pass @abstractmethod def get_info(self): pass class Gaming(ComputerParts): # Concrete Builder 1 def __init__(self) -> None: self.computer = Computer() def set_cpu(self): self.computer.cpu = "i7 12700" def set_ram(self): self.computer.ram = "32GB" def set_gpu(self): self.computer.gpu = "RTX 3070ti" def set_disk(self): self.computer.disk = "1 TB" def set_power(self): self.computer.power = "850W" def set_mb(self): self.computer.mb = "B660A-DDR4" def get_info(self) -> Computer: return self.computer class Office(ComputerParts): # Concrete Builder 2 def __init__(self) -> None: self.computer = Computer() def set_cpu(self): self.computer.cpu = "i5 14400" def set_ram(self): self.computer.ram = "16GB" def set_gpu(self): self.computer.gpu = "Integrated Graphics" def set_disk(self): self.computer.disk = "512 GB" def set_power(self): self.computer.power = "500W" def set_mb(self): self.computer.mb = "H610M" def get_info(self) -> Computer: return self.computer class Buyer(): # Director def __init__(self, computer_parts: ComputerParts) -> None: self.computer_parts = computer_parts def build_computer(self) -> Computer: self.computer_parts.set_cpu() self.computer_parts.set_ram() self.computer_parts.set_gpu() self.computer_parts.set_disk() self.computer_parts.set_power() self.computer_parts.set_mb() return self.computer_parts.get_info() if __name__ == '__main__': gaming = Gaming() buyer = Buyer(gaming) gaming_pc = buyer.build_computer() print(gaming_pc) office = Office() another_buyer = Buyer(office) office_pc = another_buyer.build_computer() print(office_pc) ``` 輸出的結果為 ``` Computer(cpu=i7 12700, ram=32GB, gpu=RTX 3070ti, disk=1 TB, power=850W, mb=B660A-DDR4) Computer(cpu=i5 14400, ram=16GB, gpu=Integrated Graphics, disk=512 GB, power=500W, mb=H610M) ``` # 心得 以實作來說並不會很難 也不會很難理解 也許有人會想問,為什麼遊戲用的是12代但辦公用的卻是14代 因為遊戲用的那台是我自己的電腦 辦公的只是隨便上網找的==