-
Chapter 15: Prototype Pattern이전 포스팅/iOS 패턴공부는 처음이라 ... 2019. 4. 10. 11:49
Chapter 15: Prototype Pattern
정의
이전 Factory Pattern과 같은 Creational 소프트웨어 설계 패턴 중 하나로
복사하는 방법을 선언하는 복사 프로토콜과
복사 프로토콜을 준수하는 프로토타입 클래스로 나뉘는 패턴
배경
종류가 너무 많아 클래스로 정의가 어려운 경우
클래스로부터 인스턴스 생성이 어려운 경우 (일급객체를 지원하지 않는 언어에 해당)
Framework와 생성하는 인스턴스를 분리하고 싶은 경우
이점
객체 초기화의 오버 헤드1 를 제거 (Call-by-value에서 복사본이 생성이 필요 -> 오버 헤드)
동일 유형의 여러 객체가 대부분 동일한 데이터를 사용하는 유스 케이스를 단순화
Swift에서 말하는 Prototype
Objective-C에서는 NSCoping이란 프로토콜를 이미 제공
-
Swfit에서는 사용자 프로토타입 프로토콜을 생성
//MARK: 사용자 프로토타입 생성 publicprotocolCopying:class{ init(_prototype:Self) } extensionCopying{ publicfunccopy()->Self{ returntype(of:self).init(self) } }
-
프로토타입을 따르는 클래스의 생성
//MARK: 몬스터 클래스 선언 publicclassMonster:Copying{ publicvarhealth:Int publicvarlevel:Int publicinit(health:Int,level:Int){ self.health=health self.level=level } //MARK: copy을 위한 초기화 publicrequiredconvenienceinit(_monster:Monster){ self.init(health:monster.health,level:monster.level) } }
-
프로토타입의 사용
letmonster=Monster(health:700,level:37) letmonster2=monster.copy() print("Watch out! That monster's level is \(monster2.level)!")’ //Result: monster2 Level은 37
쉽게 말해
Call-by-value 행위를 하는데 monster2를 만들 때 Monster 클래스를 호출해서 불라불라 오버헤드를 거치지 않고 내부에 있는 코드 안의 monster의 복제 메소드를 이용해서 오버헤드를 줄여주는게 핵심
-
다른 방법으로 접근하면
//MARK: 게임에 대한 프로토콜을 정의 protocolGame{ varteamA:Int{getset} varteamB:Int{getset} funcsetupScore(teamA:Int,teamB:Int) //MARK: 복제메소드 선언 funcclone()->Game } //MARK: 야구게임 classBasketballGame:Game{ varteamA:Int varteamB:Int //MARK: 초기화 init(){ self.teamA=0 self.teamB=0 } //MARK: copy를 위한 초기화 init(basketballGame:BasketballGame){ self.teamA=basketballGame.teamA self.teamB=basketballGame.teamB } //MARK: 스코어 메소드 funcsetupScore(teamA:Int,teamB:Int){ self.teamA=teamA self.teamB=teamB print("Score teamA: \(teamA) vs teamB: \(teamB)") } //MARK: 자기 자신을 복제하는 메소드 funcclone()->Game{ returnBasketballGame(basketballGame:self) } } //MARK: 축구게임 classFootballGame:Game{ varteamA:Int varteamB:Int init(footballGame:FootballGame){ self.teamA=0 self.teamB=0 } funcsetupScore(teamA:Int,teamB:Int){} funcclone()->Game{ returnFootballGame(footballGame:self) } }
-
사용하는 케이스
letbasketallGame=BasketballGame() basketallGame.setupScore(teamA:37,teamB:45) letHalfTimeScore=basketallGame.clone() print("전반전 A팀 스코어 : \(HalfTimeScore.teamA)") //Result: 37 print("전반전 B팀 스코어 : \(HalfTimeScore.teamB)") //Result: 45 basketallGame.setupScore(teamA:40,teamB:45) letendTimeScore=basketallGame.clone() print("경기종료 A팀 스코어 : \(endTimeScore.teamA)") //Result: 40 print("경기종료 B팀 스코어 : \(endTimeScore.teamB)") //Result: 45
[1^] 오버헤드 프로그램의 실행흐름 도중에 외부 함수를 사용할 때 추가적인 시간, 메모리, 자원이 사용되는 현상
GitHub
github.com/qbbang/PatternPrototype
참고 문헌
Design Patterns by Tutorials By Joshua Greene & Jay Strawn
참고 링크
댓글
-