# 前言
這次是這系列的第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代
因為遊戲用的那台是我自己的電腦
辦公的只是隨便上網找的==