라즈베리파이반

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

제목디자인 패턴(Design Pattern) : 팩토리 메서드 / 추상화 팩토리2022-06-06 14:10
작성자user icon Level 4

88x31.png


1. 팩토리 메서드 패턴(Factory Method Pattern)


팩토리 메서드 패턴은 상위 클래스에서는 객체를 생성하는 인터페이스를 정의하고, 객체의 생성은 하위 클래스에게 위임하는 패턴입니다. 다시 말해서 하위 클래스에서 팩토리 메소드를 오버라이딩하여 객체를 생성하는 패턴입니다.


팩토리 메소드 패턴의 클래스 다이어그램은 다음과 같습니다.

1920px-FactoryMethod.svg.png



Creator에서 제품을 생산하기로 했다면 어떤 제품을 생산할지 결정할 뿐, 구체적인 제품 생산은 Creator의 factoryMethod를 상속받은 concreteCreator에서 하게 됩니다.


예제코드를 작성해보겠습니다. 컴퓨터를 한 대 만든다고 합시다.


Computer.java:

14CAAAGyfMGAACKJ3oBACie6AUAoHiiFwCA4oleAACK9wcKJSI8C0DR7wAAAABJRU5ErkJggg==

Computer 클래스는 추상클래스로서, 위에 다이어그램에 따르면 Creator에 해당합니다. 주의할 것은 인스턴스를 생성하는 ComputerFactory는 팩토리 메서드가 아닙니다. abstract로 선언된 createComputer가 팩토리 메서드 입니다.


SamsungComputer.java:

d8FmDoR3RM0AAAAASUVORK5CYII=


LGComputer.java:

Qduqfr6dXREREREQWxMiJgKrwXC+5gMGZiIiIiN44RpZnVMP+C49h7WyNYTVsTNsjIiIiIiILU6qaZisHa3jbWJmqL0REREREFokTAYmIiIiIDGBoJiIiIiIywOjQfDLtuSn7QURERERksYwOzVl3cvFMmY8Bs1xN2R8iIiIiIotjdGi+f7IAHfpdxyXnl4j77S2cXORryn4REREREVkMAz9uUqRhTyvs+8oPiftlaPHxNVP2iYiIiIjIohg90jy0ex3Ukljj0uYnpuwPEREREZHF4eoZREREREQGMDQTERERERnA0ExEREREZABDMxERERGRAUaG5pcY1KkeXiTmYak8z7Q9IiIiIiKyMAaWnHuJI4fbwE0qRcFTJb759O7r6RURERERkQWReHh4KM3dCSIiIiIiS8aaZiIiIiIiAxiaiYiIiIgM0FvTvHzFMgDA3DnzXltniIiIiIgsEUeaiYiIiIgMMLB6BvD8+fPX0Q8iIiIiIovFkWYiIiIiIgMYmomIiIiIDGBoJiIiIiIy4P8BGhyFZ2BVHvcAAAAASUVORK5CYII=


AppleComputer.java:

wEu40s3QS6H2wAAAABJRU5ErkJggg==


SamsungComputer, LGComputer, AppleComputer 클래스는 모두 Computer 클래스를 상속하고 있으며, 이는 클래스 다이어그램에서 Concrete Creator에 해당합니다. 세 클래스 모두 팩토리 메서드인 createComputer를 오버라이딩하고 있습니다.


이제 컴퓨터를 만들어보겠습니다.


Test.java:

g8XMeCitlHFvwAAAABJRU5ErkJggg==


8HvCkBflNnghYAAAAASUVORK5CYII= 


동일한 메소드로 3개의 다른 객체가 만들어졌습니다!


ComputerFactory는 클래스 메소드로서, Computer 클래스에 의한 인스턴스화 없이 생성된 독립된 객체의 메소드라 보시면 됩니다. 이 메소드에 의하여 컴퓨터가 만들어지는데 제조사 이름만 결정된다면 그 제조사에 대한 컴퓨터 클래스로부터 객체가 만들어지도록 합니다. 즉, Computer 인스턴스가 만들어지는데 있어서 Computer 클래스에 의하여 만들어 지는 것이 아니라 각각 SamsungComputer, LGComputer, AppleComputer 클래스에 의하여 만들어집니다.


이 패턴은 주로 상위 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없거나 하위 클래스의 정보를 감추고 싶을때 사용합니다. 


개방폐쇄의 원칙(OCP, Open-Closed Principle)은 객체지향 설계의 원칙중 하나로, 기존코드를 변경하지 않으면서 기능을 추가할 수 있어야 합니다. 팩토리 메서드 패턴은 객체의 생성을 하나의 클래스에서 관리하면서 결합도를 줄여 OCP를 지킬 수 있습니다. 



2. 추상 팩토리 패턴(Factory Method Pattern) 


추상 팩토리 패턴은 연관된 하위 클래스를 특정 그룹으로 묶어서 한번에 교체할 수 있도록 하는 패턴입니다. 팩토리 메서드 패턴과 유사한데 팩토리 메서드에서는 팩토리에서 구체적인 클래스를 지정하여 인스턴스를 생성한 반면 추상 팩토리 패턴은 상위 팩토리 클래스가 따로 존재하여 하위 팩토리 클래스에 대한 인터페이스를 제공하고 인스턴스의 생성은 하위 팩토리 클래스에서 발생합니다.



1920px-Abstract_factory.svg.png



바로 예제 코드를 작성해보겠습니다. 


GUIFactory.java:

dbksU0i7xFAAAAAElFTkSuQmCC 

GUI 팩토리 인터페이스 입니다. 버튼을 만드는 Creator이며 추상화된 인터페이스입니다.


OSXFactory.java:

f46lBBCiGFARiBCCCEMkQAihBDCEAkgQgghDJEAIoQQwhAJIEIIIQyRACKEEMIQCSBCCCEM+V+cKxy9d2iduQAAAABJRU5ErkJggg== 

GUI 팩토리를 상속받는 OSX 팩토리 입니다. 맥버튼 객체를 만드는 Concreate Creator 입니다.


WinFactory.java:

rX3wDwRuHGfjdGCCHE8CE9ECGEEIb4bMhUb2+vrzYlhBBiGJAeiBBCCEMkgAghhDBEAogQQghDJIAIIYQwRAKIEEIIQySACCGEMEQCiBBCCEP+GzRcX1I6UPCoAAAAAElFTkSuQmCC 

GUI 팩토리를 상속받는 윈도우 팩토리 입니다. 윈도우 버튼 객체를 만드는 Concreate Creator 입니다.


Button.java:

AdHp0qFnQhu0AAAAAElFTkSuQmCC 

버튼 인터페이스입니다. Product라고 보시면 됩니다.


OSXButton.java:

uCJdeYW0XWgAAAABJRU5ErkJggg== 

버튼 인터페이스를 상속받은 맥버튼입니다.


WinButton.java:

oApsshX5xHCCHGvYBE2sItRsoXDwPRvPqYfDVeCCFGmxRjEEKIECQ5byGECEF+p03Cw8MD0Q8hhBBekJG3EEKEoIBNDRkeHg5UU0IIIdyQkbcQQoQgCd5CCBGCJHgLIUQIkuAthBAhSIK3EEKEoP8Hqf1bFFVPlYoAAAAASUVORK5CYII= 

버튼 인터페이스를 상속받은 윈도우 버튼입니다.


Application.java:

n8bM8jpueMdpQAAAABJRU5ErkJggg== 

버튼을 만드는 클라이언트 입니다.


AdJySGCEET2hJCBpCq1BgDY32X2l5U4UCa2iMCrqmsmFArcAaGq8QWtTfIpguXiE01OT6nAPbkbqdTkYFo4O8ivIfsBuIk1XM3Z5ADJTCdTI6BMtCq1JgDY1XPZDvQouHC7rE4XIScdiBxGEHEocdSBx2IHF+ABKvguACWPBUAAAAAElFTkSuQmCC 


추상화 팩토리에 있는 팩토리 메소드가 하나라서 직관적으로 차이가 무엇인지 잘 모를수도 있지만 만약 알람 메소드가 추가된다면 GUI 팩토리를 상속받은 윈도우 팩토리와 맥 팩토리는 각각 서로 다른 알람을 생성하게 될 것입니다. 하위 클래스의 코드에 변화가 있더라도 상위 클래스에는 영향을 미치지 않습니다. 즉, OCP를 더욱 강화한 패턴이라 볼 수 있습니다.

#디자인 패턴# 팩토리 메서드 패턴# 추상화 팩토리 패턴
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)