Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- protocol
- 객체지향프로그래밍
- 개발자
- 디자인패턴
- 함수형패러다임
- 고차함수
- 협업
- 인터페이스
- 의도
- 이름
- SWIFT
- 네이밍
- IOS
- DesignPattern
- 클린코드
- Solid
- POP
- iOS프로그래밍
- 부스트코스
- CleanCode
- 의존성
- 아이폰프로그래밍
- fp
- 클린소프트웨어
- 개발
- OOP
- interface
- 문법
- Swfit
- 함수형프로그래밍
Archives
- Today
- Total
밤에 쓴 코드
Design Pattern) 팩토리 패턴 본문
Factory - 팩토리
구체적이면 구체적일 수록 변화에 취약하다.
인스턴스를 생성하는 코드는 되게 구체적인 부분이라 유연하지 않다.
그 부분을 분리하기 하여 관리하려는 노력에서 나온 패턴이다.
변화에 취약한 부분을 분리하자
- 구체적이면 구체적인 부분일수록 변화에 취약하다.
- 특정 구상 클래스의 인스턴스를 생성하는 부분은 굉장히 구체적인 부분이므로 , 분리해서 관리하는 것이 좋다.
- 구체적인 클래스에 직접적으로 접근하는 것은 팩토리 만으로 한정 짓는다.
생성할 객체를 추상화하자
- 팩토리메소드는 구상클래스의 인스턴스를 반환한다 .
- 하지만 생성된 인스턴스를 받을 구체적인 타입을 알지 못한다.
좀더 세분화하여 구체적인 객체를 생성해야 한다면 생성 자체를 추상화하자
객체를 생성함에 있어서 단계를 나눌 수 있다. *게임오브젝트 - 플레이어 + 전사 + 마법사 - 몬스터 + 슬라임 + 좀비 이렇게 2단계적으로 구체화를 거쳐가는 구조인 예에서, 게임오브젝트를 생성하는 클래스는 추상클래스로 정의하고 , 생성 메소드는 추상메소드로 정의한다. 게임오브젝트팩토리를 상속받는 플레이어팩토리,몬스터팩토리 에서 생성메소드를 구체화하면 책임을 더 분리할수 있다.
예
GameObjectFactory.java
public abstract class GameObjectFactory { public abstract GameObject createGameObject(String type); }
PlayerFactory.java
public class PlayerFactory extends GameObjectFactory{ @Override public GameObject createGameObject(String type) { switch (type){ case "Warrior": return new Warrior(); case "Wizard": return new Wizard(); } return null; } }
MonsterFactory.java
public class MonsterFactory extends GameObjectFactory{ @Override public GameObject createGameObject(String type) { switch (type){ case "Slime": return new Slime(); case "Zombie": return new Zombie(); } return null; } }
객체의 구성을 통해 행동을 동적으로 관리하자
동작은 상태에 의존하여 결과를 뱉는다
객체의 구성을 이용하면 특정 추상화된 타입의 실체를 변경함으로서 , 동작을 변경할 수있다.
예)
Generator.java
public class Generator { GameObjectFactory factory; public void setFactory(GameObjectFactory factory) { this.factory = factory; } public GameObject generate(String type){ GameObject gameObject = factory.createGameObject(type); gameObject.hello(); return gameObject; } }
Game.java
public class Game { public static void main(String [] arg){ Generator generator = new Generator(); generator.setFactory(new PlayerFactory()); generator.generate("Warrior"); // 안녕하세요!전사가 생성되었습니다 generator.generate("Wizard"); // 안녕하세요!마법사가 생성되었습니다 generator.setFactory(new MonsterFactory()); // 객체의 구성을 변경을 통한 동작을 동적 제어 generator.generate("Slime"); //안녕하세요!슬라임가 생성되었습니다 generator.generate("Zombie"); //안녕하세요!좀비가 생성되었습니다 } }
UML
'Design Pattern' 카테고리의 다른 글
Design Pattern) 싱글턴 패턴 (0) | 2019.06.23 |
---|---|
Design Pattern) 데코레이터 패턴 (0) | 2019.06.07 |
Design Pattern) 옵저버 패턴 (0) | 2019.05.03 |
Design Pattern) 스트래티지 패턴 (1) | 2019.04.28 |
Design Pattern ) 디자인패턴이란? (0) | 2019.04.28 |
Comments