본문 바로가기
2023년 이전/디자인 패턴

디자인 패턴 - 추상 팩토리 패턴(Abstract Factory Pattern)

by JeongUPark 2019. 11. 20.
반응형

다양한 구성 요소 별로 '객체의 집합'을 생성해야 할 때 유용하다. 이 패턴을 사용하여 상황에 알맞은 객체를 생성할 수 있다. 제품군을 생성하기 위한 인터페이스를 생성 그 인터페이스를 구성하여 사용할수 있게끔 하는 것입니다.

다시 정리하면 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴입니다. 즉, 관련성 있는 여러 종류의 객체를 일관된 방식으로 생성하는 경우에 유용하다.

 

관련 예시 code는 다음과 같습니다.

 

public interface RobotPartsFacotry {
    String getName();
    String getVersion();
    ArmPart createArm();
    BodyPart createBody();
    HeadPart createHead();
    LegPart createLeg();
}
public abstract class ArmPart {
}
class fire_arm extends ArmPart{
    fire_arm(){
        System.out.println("fire_arm");
    }
}
class laser_arm extends ArmPart{
    laser_arm(){
        System.out.println("laser_arm");
    }
}
public abstract class BodyPart {
}
class titanium_body extends BodyPart{
    titanium_body(){

        System.out.println("titanium_body");
    }

}
class iron_body extends  BodyPart{
    iron_body(){

        System.out.println("iron_body");
    }

}
public abstract class HeadPart {
}
class support_head extends HeadPart{
    support_head(){

        System.out.println("support_head");
    }
}
class normal_head extends HeadPart{
    normal_head(){

        System.out.println("normal_head");
    }
}
public abstract class LegPart {
}
class fly_leg extends LegPart{
    fly_leg(){

        System.out.println("fly_leg");
    }
}
class normal_leg extends LegPart{
    normal_leg(){

        System.out.println("normal_leg");
    }
}
public class Robot_1_factory implements RobotPartsFacotry {
    private String name;
    private String version;
    Robot_1_factory(String name,String version){
        this.name = name;
        this.version = version;
    }
    @Override
    public String getName() {
        return name;
    }
    @Override
    public String getVersion() {
        return version;
    }
    @Override
    public ArmPart createArm() {
        return new fire_arm();
    }
    @Override
    public BodyPart createBody() {
        return new iron_body();
    }
    @Override
    public HeadPart createHead() {
        return new normal_head();
    }
    @Override
    public LegPart createLeg() {
        return new normal_leg();
    }
}
public class Robot_2_factory implements RobotPartsFacotry {
    private String name;
    private String version;
    Robot_2_factory(String name,String version){
        this.name = name;
        this.version = version;
    }
    @Override
    public String getName() {
        return name;
    }
    @Override
    public String getVersion() {
        return version;
    }
    @Override
    public ArmPart createArm() {
        return new laser_arm();
    }
    @Override
    public BodyPart createBody() {
        return new titanium_body();
    }
    @Override
    public HeadPart createHead() {
        return new support_head();
    }
    @Override
    public LegPart createLeg() {
        return new fly_leg();
    }
}
public abstract class Robot {

    public abstract void showInfo();
}
public class JP extends Robot{
    RobotPartsFacotry facotry;
    JP(RobotPartsFacotry facotry){
        this.facotry = facotry;
    }
    @Override
    public void showInfo() {
        System.out.println("name: "+facotry.getName());
        System.out.println("version: "+facotry.getVersion());
        facotry.createArm();
        facotry.createBody();
        facotry.createHead();
        facotry.createLeg();
    }
}
public class Factory {

    public Robot createFactory(String type){
        Robot robot = null;
        switch (type){
            case "old": robot = new JP(new Robot_1_factory("JP_1","1.0.0"));
                break;
            case "new":  robot = new JP(new Robot_2_factory("JP_2","2.0.0"));
                break;
        }
        return robot;
    }
}
public class Client {

    public static void main(String[] args){

       Factory ft = new Factory();
       Robot robot_1 = ft.createFactory("old");

       robot_1.showInfo();


        Robot robot_2 = ft.createFactory("new");
        robot_2.showInfo();
    }
}

 

Robot을 만들 때 각 version 별 Robot의 파츠를 정하고 그 정보를 노출하게 됩니다. 각 버전 별 factory에서 필요한 객체 집합을 생성하게 됩니다. 새로운 버전의 로봇이 필하다면 새로운 Factory를 만들어서 추가하면 됩니다. ex) Robot_3_Factory

 

 

참고

https://ko.wikipedia.org/wiki/%ED%8C%A9%ED%86%A0%EB%A6%AC_%EB%A9%94%EC%84%9C%EB%93%9C_%ED%8C%A8%ED%84%B4

https://gmlwjd9405.github.io/2018/08/08/abstract-factory-pattern.html

https://jusungpark.tistory.com/14?category=630296

반응형