[디자인 패턴] Builder Pattern by python, java
Builder 패턴
builder패턴은 커다란 구조물(클래스) 등을 만들 때 차근차근히 쌓아 올리는 구조를 갖는 builder패턴을 공부해보겠습니다.
얼핏 보면 이전에 공부했던 템플릿 패턴과 비슷한 면이 있습니다. 템플릿 패턴은 메소드들로 큰틀을 갖추어 놓고 추상클래스의 상속을 통해 구체적으로 실행되게 만들었습니다.
이것도 비슷하게 constructor라는 메소드에 추상클래스의 메소드들로 어떻게 실행될지 정해 놓고 어떤 객체가 전달되냐에 따라 실행 결과가 달라집니다.
한개의 폴더에서 실행됩니다.
Builder.java
메소드들은 문서에 개별항목을 추가하는 함수입니다.
Director.java
여기서 Builder객체를 생성자에서 받고 있는데 추상 클래스인 Builder 클래스를 받는 이유는 Builder객체를 상속하고 있으면 어떤 객체를 받던지 교체하여 사용할 수 있기 때문입니다. 한마디로 Director클래스는 Builder 클래스의 하위 클래스를 모르고 있습니다. 모르기 때문에 Builder를 상속하고 있다면 교체하여서 사용할 수 있습니다.
TextBuilder.java
HtmlBuilder.java
ConcreteBuilder의 객체를 Director에 등록시켜 만들어 놓은 메소드에 맞게 constructor에 실행됩니다.
Main.java
여기서 볼 중요한 점은 main함수는 Builder클래스의 존재를 모릅니다. 그냥 Director의 constructor를 실행함으로서 내부에서는 정확히 어떻게 돌아가는지 모르게 됩다.
상속을 통해서 각 클래스 사이에서 얕은 연결을 통해서 다형성을 만들 수 있게됩니다.
Builder.py
import abc
class Builder:
__metaclass__ = abc.ABCMeta
def setTitle(self, title):
pass
def setText(self, text):
pass
def setItems(self, items):
pass
def close(self):
pass
def getResult(self): pass
Director.py
class Director:
def __init__(self, builder):
self.builder = builder
def constructor(self):
self.builder.setTitle("Greet")
self.builder.setText("아침에는")
self.builder.setItems(["goodMorning", "좋은 아침입니다.", "좋아"])
self.builder.setText("저녁에는")
self.builder.setItems(["goodEvening", "멋진 저녁입니다.", "좋아"])
self.builder.close()
HtmlDcoument.py
from Builder import Builder
class HtmlDocuments(Builder):
def __init__(self):
self.str = ""
def setTitle(self, title):
self.str += "<h1>"+title+"</h1>\n"
def setText(self, text):
self.str += "<p>" + text + "</p>\n"
def setItems(self, items):
self.str+="<ul>"
for i, item in enumerate(items):
self.str += "<li>"+str(i)+". "+item+"</li>\n"
self.str += "</ul>\n"
def close(self):
super().close()
def getResult(self):
return self.str
TextDocument.py
from Builder import Builder
class TextDocuments(Builder):
def __init(self):
self.str = ""
def setTitle(self, title):
self.str+="----------------------------"
self.str += title+"\n"
def setText(self, text):
self.str += text + "\n"
def setItems(self, items):
for i, item in enumerate(items):
self.str += "<li>"+i+". "+item+"</li>\n"
def close(self):
super().close()
def getResult(self):
return self.str
Main.py
from Director import Director
from HtmlDocuments import HtmlDocuments
from TextDocuments import TextDocuments
def isHtml(order):
return order == "html"
def makeDocumeents(documents):
director = Director(documents)
director.constructor()
print(documents.getResult())
if __name__ == "__main__":
order = input()
if isHtml(order):
htmlDocuments = HtmlDocuments()
makeDocumeents(htmlDocuments)
else:
TextDocuments = TextDocuments()
makeDocumeents(TextDocuments)