최신판 |
당신의 편집 |
1번째 줄: |
1번째 줄: |
| ==개요== | | ==개요== |
| ;factory method pattern; factory method, factory pattern | | ;factory method pattern; factory method |
| ;팩토리 메소드 패턴, 팩토리 메서드, 팩토리 패턴 | | ;팩토리 메소드 패턴, 팩토리 메서드 |
| * [[생성 패턴]]의 하나
| | *하위클래스에서 인스턴스 생성하도록 하는 구조 |
| * 하위클래스에서 인스턴스를 생성하도록 하는 구조 | | *공장에서 제품을 만들어내듯, OO공장 인스턴스가 OO을 만들어내는 구조 |
| * 공장에서 제품을 만들어내듯, OO공장 인스턴스가 OO을 만들어내는 구조 | | *추상 단계<ref>interface 또는 abstract class</ref>에서는 생성하려는 객체의 클래스를 정확히 지정하지 않음 |
| * 서브클래스에서 오브젝트 생성 방법과 클래스를 결정하도록 강제하는 구조
| |
| * 생성 책임을 분리한다.
| |
| * 생성 로직을 클라이언트에서 분리한다.
| |
| * 생성 대상 클래스의 생성자를 private으로 만든다.
| |
| * 생성할 객체를 결정하기 위해 상속을 사용한다.
| |
| * 추상 단계<ref>interface 또는 abstract class</ref>에서는 생성하려는 객체의 클래스를 정확히 지정하지 않는다. | |
| * ConcreteCreator 클래스에 오브젝트 생성을 맡긴다.
| |
| * 팩토리 메소드 패턴은 [[템플릿 메소드 패턴]]의 특수한 경우이다.
| |
|
| |
|
| ==구조==
| | [[File:FactoryMethod.svg|400px]] |
| [[파일:FactoryMethod.svg|420px]] | |
| | |
| [[File:W3sDesign_Factory_Method_Design_Pattern_UML.jpg]]
| |
| * Creator 클래스는, Product1 클래스를 직접 인스턴화하지 않는, Product 객체를 필요로 한다.
| |
| * 대신 Creator는 product 객체를 생성하는 개별 factoryMethod()를 참조하는 방식으로는, 인스턴트화할 구체 클래스와 분리된다.
| |
| * Creator의 하위클래스들은 인스턴스화할 클래스를 재정의할 수 있다.
| |
| * 하위클래스 Creator1는, Product1 클래스를 인스턴화함으로써, factoryMethod()를 구현한다.
| |
|
| |
|
| ==예제 (java)== | | ==예제 (java)== |
| <syntaxhighlight lang='java' run> | | <source lang='java'> |
| public class Main { | | public class MazeGame { |
| public static void main(String[] args) {
| | public MazeGame() { |
| SedanFactory sedanFactory = new SedanFactory();
| | Room room1 = makeRoom(); |
| Car car = sedanFactory.makeCar();
| | Room room2 = makeRoom(); |
| System.out.println("Type: " + car.getType() );
| | room1.connect(room2); |
| }
| | this.addRoom(room1); |
| | this.addRoom(room2); |
| | } |
| | |
| | protected Room makeRoom() { |
| | return new OrdinaryRoom(); |
| | } |
| } | | } |
| | | </source> |
| interface CarFactory {
| | <source lang='java'> |
| public Car makeCar();
| | public class MagicMazeGame extends MazeGame { |
| | @Override |
| | protected Room makeRoom() { |
| | return new MagicRoom(); |
| | } |
| } | | } |
| | </source> |
|
| |
|
| interface Car {
| | ==같이 보기== |
| public String getType();
| | *[[디자인 패턴]] |
| }
| |
|
| |
|
| class SedanFactory implements CarFactory {
| | ==주석== |
| public Car makeCar() { return new Sedan(); }
| | <references/> |
| }
| |
| | |
| class Sedan implements Car {
| |
| public String getType() { return "Sedan"; }
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| ==같이 보기== | |
| {{z컬럼3|
| |
| * [[DAO]]
| |
| * [[싱글턴 패턴]]
| |
| * [[디자인 패턴]]
| |
| * [[의존성 역전]]
| |
| * [[DAOFactory]]
| |
| * [[컴포지트 패턴]]
| |
| * [[이터레이터 패턴]]
| |
| * [[메소드 오버로딩]]
| |
| * [[추상 팩토리 패턴]]
| |
| * [[템플릿 메소드 패턴]]
| |
| }}
| |
|
| |
|
| ==참고== | | ==참고 자료== |
| * {{영어위키백과|Factory method pattern}} | | *http://en.wikipedia.org/wiki/Factory_method_pattern |
|
| |
|
| [[분류: 디자인 패턴]] | | [[분류: 디자인 패턴]] |