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
반응형