Builderパターン(2) ポリモーフィックなBuilder

Rubyによるデザインパターン』(ラス・オルセン著 ピアソン・エデュケーション刊)の例をPythonに変換して書いています。目次


Builderも一つのクラスなので、当然サブクラス化することが出来ます。

前項では単なるComputerを作りましたが、今回はデスクトップとラップトップの2種類のコンピュータを同時に作る事になりました。

デスクトップとラップトップでは、部品が違う事に注意しなければなりません。

class ComputerBuilder(object):
    def computer(self):
        return self._computer
    
    #デスクトップ・ラップトップ共通のコード

class DesktopComputerBuilder(ComputerBuilder):
    def __init__(self):
        self._computer = DesktopComputer()
    
    def set_display(self, display):
        self._computer.display = display
    
    def add_cd(self, writable=False):
        self._computer.drives.append(Drive("cd", 760, writable))
    
    def add_harddisk(self, size_in_mb):
        self._computer.drives.append(Drive("harddisk", size_in_mb, True))

class LaptopComputerBuilder(ComputerBuilder):
    def __init__(self):
        self._computer = LaptopComputer()
    
    def set_display(self, display):
        assert display!="lcd", "Laptop display must be lcd"
        self._computer.display = display
    
    def add_cd(self, writable=False):
        self._computer.drives.append(LaptopDrive("cd", 760, writable))
    
    def add_harddisk(self, size_in_mb):
        self._computer.drives.append(LaptopDrive("harddisk", size_in_mb, True))