투케이2K

55. (TWOK/ALGORITHM) [Android] 패턴 - 팩토리 패턴 (Factory Pattern) 구현 실시 본문

투케이2K 알고리즘

55. (TWOK/ALGORITHM) [Android] 패턴 - 팩토리 패턴 (Factory Pattern) 구현 실시

투케이2K 2022. 8. 24. 15:00

[환경 설정 및 설명]

언 어 : Android (Java)

설 명 : 패턴 - 팩토리 패턴 (Factory Pattern) 구현 실시

 

[클래스 구조]

 

[요약 설명]

    /**
     * TODO [클래스 설명]
     * // -----------------------------------------
     * 1. 팩토리 패턴 정의 클래스
     * // -----------------------------------------
     * 2. 팩토리 패턴 :
     *
     *  다수의 자식 클래스를 가진 슈퍼 클래스가 있을 경우 매개 변수 값에 따라서 해당 자식 클래스의 인스턴스를 반환해줍니다
     *
     *  팩토리 패턴 구현에 필요한 슈퍼 클래스는 인터페이스, 추상 클래스, 일반 클래스 모두 가능합니다
     *
     *  팩토리 패턴은 클라이언트와 구현 객체들 사이에 추상화를 제공합니다
     * // -----------------------------------------
     * 3. 팩토리 패턴 사용 이유 :
     *
     *  - 일반 클래스에서 서브 클래스의 인스턴스화 (객체 생성) 를 제거해 서로 간의 종속성을 낮추며 확장을 쉽게할 수 있습니다
     *  - 서브 클래스에서 코드 수정이 발생해도 일반 클래스에서는 알 수 없으므로 코드 수정을 할 필요가 없습니다 (분업 용이)
     *  // -----------------------------------------
     * */
 

[Abstract_Class : 소스 코드]

package com.example.testapp.FactoryPattern;

import org.json.JSONObject;

public abstract class Abstract_Class {

    // [추상 메소드 헤더 정의 실시]
    public abstract String getName();
    public abstract int getAge();


    // [toString 메소드 재정의]
    @Override
    public String toString() {
        return "name = " + getName() + " / " + "age = " + getAge();
    }

}
 

[Factory_Class : 소스 코드]

package com.example.testapp.FactoryPattern;

public class Factory_Class {


    /**
     * TODO [클래스 설명]
     * // -----------------------------------------
     * 1. 팩토리 패턴 정의 클래스
     * // -----------------------------------------
     * 2. 팩토리 패턴 :
     *
     *  다수의 자식 클래스를 가진 슈퍼 클래스가 있을 경우 매개 변수 값에 따라서 해당 자식 클래스의 인스턴스를 반환해줍니다
     *
     *  팩토리 패턴 구현에 필요한 슈퍼 클래스는 인터페이스, 추상 클래스, 일반 클래스 모두 가능합니다
     *
     *  팩토리 패턴은 클라이언트와 구현 객체들 사이에 추상화를 제공합니다
     * // -----------------------------------------
     * 3. 팩토리 패턴 사용 이유 :
     *
     *  - 일반 클래스에서 서브 클래스의 인스턴스화 (객체 생성) 를 제거해 서로 간의 종속성을 낮추며 확장을 쉽게할 수 있습니다
     *  - 서브 클래스에서 코드 수정이 발생해도 일반 클래스에서는 알 수 없으므로 코드 수정을 할 필요가 없습니다 (분업 용이)
     *  // -----------------------------------------
     * */





    /**
     * TODO [팩토리 패턴 사용 방법]
     * // -----------------------------------------
     *         try {
     *             Abstract_Class sub_1 = Factory_Class.getInfo(1, "투케이", 29);
     *             Abstract_Class sub_2 = Factory_Class.getInfo(2, "TWOK", 29);
     *
     *             Log.i("---","---");
     *             Log.w("//===========//","================================================");
     *             Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 팩토리 데이터 확인]");
     *             Log.i("","\n"+"[sub_1 :: "+String.valueOf(sub_1.toString())+"]");
     *             Log.i("","\n"+"[sub_2 :: "+String.valueOf(sub_2.toString())+"]");
     *             Log.w("//===========//","================================================");
     *             Log.i("---","---");
     *         }
     *         catch (Exception e){
     *             e.printStackTrace();
     *         }
     * // -----------------------------------------
     * */



    // TODO [서브클래스 인스턴스를 리턴하는 메소드 작성]
    public static Abstract_Class getInfo(int type, String name, int age){

        // [분기 처리 실시]
        if (type == 1){
            return new Sub_1_Class(name, age);
        }
        else if (type == 2) {
            return new Sub_2_Class(name, age);
        }
        else {
            return null;
        }
    }

} // TODO [클래스 종료]
 

[Sub_1_Class : 소스 코드]

package com.example.testapp.FactoryPattern;

public class Sub_1_Class extends Abstract_Class { // [추상 클래스 상속 받음]

    // [전역 변수 선언]
    private String name;
    private int age;


    // [클래스 생성자 초기화]
    public Sub_1_Class (String name, int age){
        this.name = name;
        this.age = age;
    }


    // [메소드 재정의]
    @Override
    public String getName() {
        return this.name;
    }


    // [메소드 재정의]
    @Override
    public int getAge() {
        return this.age;
    }
}
 

[Sub_2_Class : 소스 코드]

package com.example.testapp.FactoryPattern;

public class Sub_2_Class extends Abstract_Class { // [추상 클래스 상속 받음]

    // [전역 변수 선언]
    private String name;
    private int age;


    // [클래스 생성자 초기화]
    public Sub_2_Class (String name, int age){
        this.name = name;
        this.age = age;
    }


    // [메소드 재정의]
    @Override
    public String getName() {
        return this.name;
    }


    // [메소드 재정의]
    @Override
    public int getAge() {
        return this.age;
    }
}
 

[결과 출력]

 

 

반응형
Comments