라즈베리파이반

라즈베리파이 등 컴퓨터계열 게시판입니다.

제목디자인 패턴(Design Pattern) : 퍼사드 / 플라이웨이트2022-06-29 17:27
작성자user icon Level 4

88x31.png


1. 퍼사드 패턴(Facade Pattern)


퍼사드 패턴은 서브 시스템에 있는 인터페이스 집합에 하나의 인터페이스를 제공하여 고수준의 인터페이스를 정의하는 패턴입니다. 규모가 큰 프로그램일수록 관련있는 클래스들이 복잡하게 얽히게 되는데, 이때 하나의 인터페이스를 제공함으로써 로직을 순서대로 처리할 수 있도록 해줍니다.  예를 들어 로그인 절차에는 복잡한 과정이 있습니다. 디비에 접속하여 유저 아이디와 패스워드를 가져오고, 입력된 값을 비교하여 로그인 결과를 처리한 후 디비의 접속을 끊습니다. 이 복잡한 과정을 퍼사드 패턴을 통해 단순하게 만들 수 있습니다.


8D5YoCpAentSEAAAAASUVORK5CYII=


로그인 과정을 예제코드를 통해 작성해보겠습니다.


LoginProcess.java:

dzoAAAAASUVORK5CYII= 

로그인 절차가 작서된 클래스 입니다. 모든 과정은 접근자를 private로 설정하여 오직 login 메소드를 통해서만 접근이 가능합니다. login 메소드에서는 순서대로 로직을 실행시킵니다. login 메소드만이 퍼사드 객체를 구성하며, 퍼사드 객체에 의하여 호출되는 서브시스템들은 퍼사드 객체에 의하여 작업을 처리하지만 퍼사드 객체에 대한 정보는 가지고 있지 않다는 것을 볼 수 있습니다.


Main.java:

H9qq4EQPmznRgAAAABJRU5ErkJggg==

메인 클래스 입니다. 클라이언트는 login 이라는 메소드를 실행시키는 것만으로도 간단하게 로그인 과정을 실행시킬 수 있게 되었습니다.


nL9QT30a2wEeradmQ0XvZgST72ty9z2gzv0fyfAdv2P9DJsAAAAASUVORK5CYII= 



2. 플라이웨이트 패턴 (Flyweight pattern)


플라이웨이트 패턴은 유사한 객체들 사이의 데이터를 서로 공유하여 메모리 사용량을 줄여주는 패턴입니다. 공통으로 사용하는 리소스에 대한 인스턴스를 최초 한번만 형성하여 공유함으로써 말 그대로 메모리 사용량을 경량화 시킵니다. RPG 게임을 예로 들면 맵(map)의 지형은 동일한 스프라이트(Sprite)가 반복적으로 나타남으로써 만들어집니다.


pngwing.com.png
 

마인크래프트의 블럭입니다. 보시는 것처럼 마인크래프트는 동일한 종류의 블럭을 반복적으로 만들어 월드를 생성합니다. 마인크래프트 월드의 크기가 지구 면적의 8배라고 하는데, 만약 블럭마다 객체를 생성한다면 방대한 마인크래프트 월드를 나타내기 전에 컴퓨터가 죽어버릴 것입니다. 반복적으로 사용되는 블럭 객체를 하나만 생성하고 공유함으로써 메모리 사용을 크게 줄일 수 있습니다.


예제코드를 작성해보도록 하겠습니다.


qSoD0SJ9wX0orGxMf0fRKz2kJccPI8AAAAASUVORK5CYII=


복잡해보이지만 Weapon이라는 추상클래스를 Fist, Knife, Sord, Spear 클래스가 상속받고 WeaponFactory 클래스에 의해서 인스턴스가 생성되는 시나리오 입니다. WeaponFactory는 싱글톤 패턴으로 생성합니다.


Weapon.java:

w3AxuJNYR2MiIjIvUozXBEREROM6tWOfX194RqHiIjIPU0zXBERERMocEVEREygwBURETGBAldERMQEClwRERETKHBFRERM8P8BRkl9OqoZopMAAAAASUVORK5CYII= 

각종 무기의 추상 클래스 입니다. 무기들은 인스턴스를 공유하므로 생성자의 접근을 default로 하여 외부접근을 차단하고 속성들 또한 private로 하여 외부접근을 차단합니다. getter를 통해 읽기만 가능합니다.


Fist.java:

DFRERMYFSyiIiIiZQwBURETFBUGO4YWFh7d0OERGRm5p6uCIiIiZo060drVZre7VDRETkpqYeroiIiAkUcEVEREyggCsiImICBVwRERETKOCKiIiYQAFXRETEBAq4IiIiJlDAFRERMYECroiIiAn+P18sYH2zaayUAAAAAElFTkSuQmCC 


Knife.java:

wMPybTXbSvbjAAAAABJRU5ErkJggg== 


Sord.java:

ywZqMGkhubkAAAAASUVORK5CYII= 


Spear.java:

Az6PMS+eonVDAAAAAElFTkSuQmCC 


각종 무기들의 클래스 입니다. 무기마다 공격 방식이 다르므로 Override 리플렉션을 통해 Weapon 클래스의 attack 메소드를 재정의합니다.


WeaponFactory.java:

X9E5bLI9gKaoAAAAABJRU5ErkJggg==

핵심 부분인 무기공장 클래스 입니다. 무기 이름을 key로 하여 맵(Map)을 통해 무기들의 인스턴스가 생성되어 있는지 확인하고 없으면 무기를 만들어서 리턴해줍니다. 공장은 하나만 있으면 되므로 싱글톤 패턴으로 생성했습니다.


인스턴스를 공유하고 있는지 확인해봅시다.


Main.java:

DgAAAABJRU5ErkJggg== 


oocQAAAAASUVORK5CYII= 


하나의 인스턴스만 생성한다는 점에서 싱글톤 패턴과 유사하지만 싱글톤과 달리 하나의 공장 클래스에서 인스턴스를 생성을 통제한다는 차이점이 있습니다.

#디자인 패턴# 퍼사드 패턴# 플라이웨이트 패턴
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)