프로토타입 패턴

9
모델
우리는 이미 Factory 패턴이 여러 개 중 하나를 반환하는 것을 보았습니다.


인수에 전달된 데이터에 따라 다른 하위 클래스
생성 방법. 하지만 계산 알고리즘만 원하는 것이 아니라
그러나 필요한 데이터에 따라 매우 다른 UI
광고. 일반적인 예는 이메일 주소록일 수 있습니다.

당신은 아마 가지고
주소록에 사람과 그룹이 모두 있고
주소록 표시가 변경되어 사람들이
화면에는 성과 이름, 회사 및 이메일 주소를 입력할 수 있는 공간이 있습니다.


전화 번호.
반면에 그룹 주소 페이지를 보고 있는 경우 보고 싶은 페이지입니다.


그룹 이름, 목적, 회원 목록 및 이메일 주소
구애. 개인 항목을 클릭하면 디스플레이가 표시되고
항목을 그룹화하고 다른 광고를 가져옵니다.

모든 이메일 주소가
주소라는 개체에 저장되며 이들은 사람과 그룹입니다.


이 기본 클래스에서 파생됩니다(그림 9-1 참조).
그림 9-1 개인 또는 그룹을 보여주는 간단한 주소록
어떤 종류의 주소 개체를 클릭하느냐에 따라
이 개체의 속성 표시가 약간 다릅니다.

그건 좀 더
객체를 반환하지 않기 때문에 단순한 팩토리 패턴이 아닙니다.


기본 표시 객체의 단순한 자손이지만 완전히 다른 사용자
표시 개체의 다양한 조합으로 구성된 인터페이스입니다.

그만큼
빌더 패턴은 다음과 같은 객체 집합을 어셈블합니다.

B. 디스플레이 위젯,
데이터에 따라 다른 방식으로. 파이썬도 중 하나이기 때문에
디스플레이에서 데이터를 깔끔하게 분리할 수 있는 몇 가지 언어
메서드를 간단한 개체로 변환하는 Python은 이상적인 프로그래밍 언어입니다.


빌더 패턴.
투자 추적기
클래스를 원하는 약간 더 간단한 경우를 고려해 봅시다.


사용자 인터페이스를 만듭니다.

따를 수 있는 프로그램을 작성한다고 가정합니다.


투자 성과. 당신은 주식, 채권,
투자 자금. 각각의 보유 자산 목록을 표시하고 싶다고 가정합니다.


하나 이상의 투자를 선택하고 볼 수 있는 범주
비교 성능.
각 품종의 수를 예측할 수는 없지만
어느 시점에서 소유할 수 있는 투자, 즉 디스플레이를 원합니다.


많은 수의 펀드(예: 주식) 또는 작은 펀드에 사용하기 쉽습니다.


펀드 수(예: 뮤추얼 펀드). 어느 쪽이든, 당신은 어떤 종류를 원합니다
하나 이상의 펀드를 선택할 수 있는 객관식 디스플레이
구성. 자금이 많은 경우 선택 목록을 사용할 수 있습니다.

을 위한
예산이 3개 이하인 경우 일련의 확인란을 사용할 수 있습니다.

여기 당신은 당신을 원한다
요소 수에 따라 달라지는 인터페이스를 생성하는 빌더 클래스
표시할 수 있지만 결과를 반환하는 방법은 동일합니다.


다음 두 그림은 디스플레이를 보여줍니다.

그림 9-2는 첫 번째 화면을 보여주며,
많은 주식을 위해. 그림 9-3은 a에 대한 두 번째 디스플레이를 보여줍니다.


적은 수의 채권.
그림 9-2 주식 표시가 있는 자산 빌더
그림 9-3 채권 화면이 있는 자산 빌더
그런 다음 표시 버튼을 클릭하여 어떤 증권인지 확인할 수 있습니다.


선택한 디스플레이 유형에 관계없이 선택됨(그림 9- 참조)
4).
그림 9-4 선택된 유가증권 표시
이제 이러한 변수를 실행하는 인터페이스를 만드는 방법을 살펴보겠습니다.


광고. 다음을 정의하는 추상 MultiChoice 클래스부터 시작하겠습니다.


구현해야 하는 방법:
코드 이미지를 보려면 여기를 클릭하십시오.
클래스 다중 선택:
데프 내부에 (자체, 프레임, 선택 목록):
self.choices = choiceList #목록 저장
그 자체.프레임 = 프레임
# 파생 클래스에서 구현
def makeUI(self): #구성 요소에서 전달된 프레임
def getSelected(self): pass #항목 목록 가져오기
# 프레임의 구성 요소를 제거합니다.


데프 clearAll(자신):
self.frame.winfo_children()의 위젯:
위젯.파괴()
기본 클래스의 clearAll 메소드에 유의하십시오. 그냥 다 지워버림
프레임의 구성 요소이며 프레임에 하나가 포함된 경우 작동합니다.


Listbox 또는 일련의 CheckBoxes. 우리는 우리와 같은 CheckBox 클래스를 사용하고 있습니다.


지속되기 때문에 설계된 2장 “Python의 시각적 프로그래밍”에서
확인란이 선택되었는지 여부를 나타내는 IntVal입니다.


makeUI 메서드는 객관식 광고로 프레임을 채웁니다.


여기서 사용하는 디스플레이는 체크박스 패널과 목록 상자 패널입니다.

둘 다
이 추상 클래스에서 파생됩니다.


코드 이미지를 보려면 여기를 클릭하십시오.
클래스 ListboxChoice(MultiChoice):
또는
코드 이미지를 보려면 여기를 클릭하십시오.
클래스 CheckboxChoice(MultiChoice):
그런 다음 이 두 가지 중 어느 것을 결정하는 간단한 팩토리 클래스를 만듭니다.


다시 수업:
코드 이미지를 보려면 여기를 클릭하십시오.
클래스 초이스팩토리:
“””이 클래스는 다음을 포함하는 패널을 반환합니다.


중 하나에 의해 제시된 일련의 선택
여러 UI 방법. “””
def getChoiceUI(자체, 선택, 프레임):
len(선택) <= 3인 경우:
#체크박스 세트를 반환합니다.


CheckboxChoice 반환(프레임, 선택)
다른:
#다중 선택 목록 상자 반환
ListboxChoice(프레임, 선택) 반환
디자인 패턴 언어에서는 이 팩토리 클래스를 Director라고 합니다.


MultiChoice에서 파생되는 실제 클래스는 각각 빌더입니다.


건설사에 호소
우리는 빌더가 필요할 것입니다.


주요 클래스 건축가 또는 계약자. 그러나 우리는 목록을 다루고 있습니다.


이 예에 투자하므로 그냥 WealthBuilder라고 부르겠습니다.

이 주요 사항에서
중간에 프레임으로 구성된 인터페이스를 만드는 클래스
1 × 2 그리드 레이아웃으로 나뉩니다(그림 9-2 및 9-3 참조). 왼쪽 부분
투자 유형 목록을 포함하고 오른쪽 부분은 빈 필드입니다.


선택한 투자 유형에 따라 채웁니다.

그만큼
그리드의 두 번째 행에는 열 범위가 2인 보기 버튼이 있습니다.


코드 이미지를 보려면 여기를 클릭하십시오.
클래스 BuildUI():
데프 내부에(자신, 루트):
self.root = 루트
self.root.geometry(“250×200”)
self.root.title(“재산 빌더”)
self.seclist=() # 빈 목록으로 시작
이 간단한 프로그램에서 우리는 세 가지 투자 목록을 세 가지로 유지합니다.


이름과 유가 증권 목록이 있는 보안 클래스의 인스턴스
이런 종류의 이름 임의의 값을 사용하여 프로그램의 일부로 로드합니다.


초기화:
코드 이미지를 보려면 여기를 클릭하십시오.
def 빌드(자신):

증권 목록 생성

self.stocks= 주식(“주식”,
(“시스코”, “코카콜라”, “제너럴 일렉트릭”,
“할리 데이비슨”, “IBM”))
self.seclist.append(자체.주식)
self.bonds = 증권(“채권”,
(“CT 주 GO 2024”, “뉴욕 GO 2026”,
“GE Corp 채권”) )
self.seclist.append(self.bonds)
self.mutuals = 증권(“상호”,
(“충성도 마젤란”, “티로우 프라이스”,
“뱅가드 프라임캡”, “린드너”))
self.seclist.append(self.mutuals)
실제 시스템에서는 아마도 파일이나 데이터베이스에서 읽을 것입니다.

그 다음에
사용자가 왼쪽 목록 상자에서 세 가지 첨부 유형 중 하나를 클릭하면
우리는 적절한 보안 등급을 귀하의 공장에 전달합니다.


빌더:
코드 이미지를 보려면 여기를 클릭하십시오.

왼쪽 목록 상자 선택 시 콜백

def lbselect(self, possible):
index = self.leftList.curselection() # 튜플
i = int(index(0)) # 현재 인덱스입니다.


증권 = self.seclist(i)
cf = 초이스팩토리()
self.cui = cf.getChoiceUI(증권.getList(),
자체.rframe)
self.cui.makeUI()
공장에서 생성하는 MultiChoice 패널을 cui에 저장합니다.


변수를 플롯 대화 상자에 전달할 수 있습니다.


목록 상자 빌더
두 빌더 중 더 간단한 것이 목록 상자 빌더입니다.

패널을 반환합니다.


투자 목록을 표시하는 목록 상자를 포함합니다.


코드 이미지를 보려면 여기를 클릭하십시오.
ListboxChoice 클래스(MultiChoice):
데프 내부에 (자체, 프레임, 선택):
훌륭한(). 내부에 (프레임, 선택)

목록 상자를 만들고 프레임에 로드합니다.

def makeUI(self):
자체.clearAll()
#목록 상자를 포함하는 프레임 만들기
self.list = 목록 상자(self.frame,
selectmode=MULTIPLE) #목록 상자
self.list.pack()
목록 상자에 #investments 추가
자기 자신을 위해. 선택:
self.list.insert(END, st)
이 클래스의 다른 중요한 메소드는 getSelected 메소드입니다.

그것
사용자가 선택한 투자의 문자열 배열을 반환합니다.


코드 이미지를 보려면 여기를 클릭하십시오.

선택한 항목의 목록을 반환합니다.

getSelected(self) 정의:
sel = self.list.curselection()
셀리스트 = ()
셀에 있는 i에 대해:
st = self.list.get(i)
selist. 추가
선택 목록 반환
체크박스 빌더
확인란 빌더는 훨씬 더 간단합니다.

여기서 우리는 얼마나 많은지 알아내야 합니다.


표시할 요소를 최대한 많이 사용하여 수평 그리드를 생성합니다.


부서. 그런 다음 각 그리드 선에 확인란을 추가합니다.


코드 이미지를 보려면 여기를 클릭하십시오.
클래스 CheckboxChoice(MultiChoice):
데프 내부에 (자체, 패널, 선택):
훌륭한(). 내부에 (패널, 선택)
#체크박스 UI 생성
def makeUI(self):
self.boxes = () # 체크박스 목록
자체.clearAll()
r = 0
이름 자체에 대한 것입니다.


var = IntVar() # IntVar 생성

확인란 만들기

cb = 체크박스(self.frame, name, var)
self.boxes.append(cb) # 목록에 추가
cb.grid(열= 0 , 행=r, 스티커=W)
r + = 1

선택한 확인란 목록을 반환합니다.

getSelected(self) 정의:
items=() #빈 리스트
b 자체에 대해 상자:
b.getVar() > 0인 경우:
items.append(b.getText())
기사를 되돌려 보내다
선택한 증권의 표시
표시 버튼을 클릭하면 빌더에게 전원을 묻는 버튼이 표시됩니다.


이전에
lbselect 방법. 이것은 Securities.getList() 메서드를 호출합니다.


인터페이스가 무엇이든 상관없이 선택한 목록을 반환합니다.


ListBoxChoice와 CheckBoxChoice가 모두
클래스에는 이 getList 메서드가 있습니다.


빌더 패턴의 결과
빌더 패턴 결과는 다음과 같습니다.

  1. 빌더를 사용하면 건물의 내부 모양을 변경할 수 있습니다.


    그것이 만드는 제품. 또한 제품의 세부 정보를 숨깁니다.


    세워짐.
  2. 각 특정 빌더는 다른 빌더 및 나머지 빌더와도 독립적입니다.


    프로그램의. 이렇게 하면 모듈성이 향상되고 다른 항목을 더 쉽게 추가할 수 있습니다.


    빌더는 비교적 쉽습니다.

  3. 각 빌더가 단계별로 최종 제품을 구성함에 따라
    데이터에 따라 각 최종 제품을 더 잘 제어할 수 있습니다.


    구축했다는 것입니다.


    빌더 패턴은 둘 다라는 점에서 추상 팩토리 패턴과 비슷합니다.


    반환 클래스는 여러 메서드와 개체로 구성됩니다.

    가장 중요한
    차이점은 Abstract Factory는 친척의 가족을 반환한다는 것입니다.


    클래스, 빌더는 다음에 따라 복잡한 개체를 단계별로 구성합니다.


    그에게 제시된 데이터.
    생각 질문
  4. 일부 워드 프로세싱 및 그래픽 프로그램은 메뉴를 생성합니다.


    보고 있는 데이터의 컨텍스트에 따라 동적으로. 어떻게
    여기서 빌더를 효과적으로 사용할 수 있습니까?
  5. 모든 빌더가 시각적 개체를 구성할 필요는 없습니다.

    당신은 무엇을 사용할 수 있습니다
    개인 금융 산업의 빌더? 당신을 가정
    5~6개의 서로 다른 이벤트로 구성된 트랙 미팅의 점수를 매겼습니까? 할 수 있다
    거기에 빌더를 사용합니까?
    GitHub의 예제 코드
    BuilderChoices.py: WealthBuilder 광고를 만듭니다.