CS/Design Pattern

Builder Pattern

dawonny 2022. 3. 16. 19:10
728x90
반응형
Builder Pattern

- object의 생성과정이 복잡할 때 이를 간단하게 만들어 줌

  ex) 하나의 오브젝트를 생성할 때 여러개의 argument가 필요할 때 Builer패턴이 쉽게 만들어줄 수 있음.

 

Builder Pattern의 개념 Diagram

더 세부적인 객체를 생성할 수도 있을 것이다.


예시로 vector class를 만든다고 해보자

vector는 N차원 array 이며, 우리가 시각화 할 수 있는(Graph로 표현할 수 있는)건 2,3차원 이다.

 

2D/3D  vector object를 생성할건데 builder pattern을 통해 만든다고 해보자

* 기능은 내가 추가 해보기!

import math
from multiprocessing import set_forkserver_preload
from random import getstate


class MyVector():
  
  def __init__(self, dim, x, y, z):
    self.x = x
    self.y = y
    self.z = z
    self.dim = -1 #몇 차원
    self.dist = 0
    
  def normalize(self):
    #norm을 구하고
    mag = self.getMagnitude()
    #각 성분을 나누어줌
    self.x /= mag
    self.y /= mag
    self.z /= mag
    
  def getMagnitude(self):
    mag = math.sqrt(math.pow(self.x,2)
                    +math.pow(self.y,2)
                    +math.pow(self.z,2))
    return mag
  
  def getState(self):
    return self.x, self.y, self.z
  
  #순전히 argument에 대한 것
  #결국 이것은 object를 생성하는 클래스
class VectorBuilder:
  def __init__(self):
    self.x = None
    self.y = None
    self.z = None
    self.dim = None #몇 차원
    
  def setDim(self, dim):
    self.dim = dim
    return self
  
  def setX(self,x):
    self.x = x
    return self

  def setY(self, y):
    self.y = y
    return self

  def setZ(self, z):
    self.z = z
    return self
  
  def build(self):
    vector = MyVector(self.dim, self.x,self.y, self.z)
    return vector

vec = VectorBuilder().setDim(3).setX(50).setY(100).setZ(10).build()
print(vec.getState())

#want to create 2D vector or 3D vector using presets.

class VectorBuild2D(VectorBuilder): #상속받으면 세팅 관련해서 그래도 사용가능
  def __init__(self):
    super().__init__() #상속
    self.setZ(0) #z값 없애기(0으로)
    self.setDim(2) #2차원으로
    
class VectorBuild3D(VectorBuilder): #상속받으면 세팅 관련해서 그래도 사용가능
  def __init__(self):
    super().__init__() #상속
    self.setDim(3) #3차원으로
    
  
vec2D = VectorBuild2D().setX(50).setY(50).build()
print(vec2D.getState())
vec2D.normalize() # 정규화를 하면 mag = 1이 됨
print(vec2D.getState())
print(vec2D.getMagnitude())

vec3D = VectorBuild3D().setX(50).setY(50).setZ(100).build()
print(vec3D.getState())
vec3D.normalize()  # 정규화를 하면 mag = 1이 됨
print(vec3D.getState())
print(vec3D.getMagnitude())

굳이 VectorBuilder를 만들가 싶지만 

객체를 생성하기 위해 클래스를 따로 만들어 놓는 것이 builder pattern 의 핵심


여기서 Director는 preset 역할을 한다.

ex) numpy에서 numpy.zeros()는 0으로 초기화된 shape 차원의 ndarray 배열 객체를 반환함.

 

#Director 만들기
class Director:
  def vectorZeros(builder:VectorBuilder):#preset argument
    builder.setX(0)
    builder.setY(0)   
    builder.setZ(0)
    
  def vectorOnes(builder: VectorBuilder):  # preset argument
    builder.setX(1)
    builder.setY(1)
    builder.setZ(1)

builder3D = VectorBuild3D()
Director.vectorOnes(builder3D) #builder를 통과시켜줌

vec3D = builder3D.build()
print(vec3D.getState)

 

728x90
반응형