ComputerScience,Engineering/디자인패턴

1.A) Creational Pattern - Class

TimeSave 2022. 9. 5. 19:49

 

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

: 객체를 만들어내는 부분을 서브 클래스Sub-Class에 위임하는 패턴.

 즉, new 키워드를 호출하는 부분을 서브 클래스에 위임

 

어떤경우에 사용? : 직접 객체를 생성해 사용하는 것을 방지, 클래스간의 결합도 낮추고 싶을 때.

=> 새로운 로봇이 추가 되고 새로운 팩토리가 추가 된다 하더라도 메인 프로그램에서 변경할 코드는 최소화

 

  • 메인 프로그램에서 new 키워드가 없다는 것을 확인 할 수 있습니다. 
    • 메소드 콜로 객체 생성
    • 객체 생성을 팩토리 클래스에 위임한 결과.
    • 메인 프로그램은 어떤 객체가 생성 되었는지 신경 쓰지 않고 단지 반환된 객체를 사용만 하면 됩니다.
    • 새로운 로봇이 추가 되고 새로운 팩토리가 추가 된다 하더라도 메인 프로그램에서 변경할 코드는 최소화됩니다.
  • Enum을 잘 활용하는 사례도 있음.(아래 wiki link)

 

  • 팩토리 메소드 패턴을 사용하는 이유는 클래스간의 결합도를 낮추기 위한 것입니다.
    • 결합도라는 것은 간단히 말해 클래스의 변경점이 생겼을 때 얼마나 다른 클래스에도 영향을 주는가입니다.
    • 팩토리 메소드 패턴을 사용하는 경우 직접 객체를 생성해 사용하는 것을 방지하고 서브 클래스에 위임함으로써 보다 효율적인 코드 제어를 할 수 있고 의존성을 제거합니다. 결과적으로 결합도 또한 낮출 수 있습니다.
  • 클래스 계의 Getter-Setter라고 할까..

 

 

 

Robot(abstract class)
	┗ SuperRobot
	┗ PowerRobot

RobotFactory(abstract class)
	┗ SuperRobotFactory
	┗ ModifiedSuperRobotFactory
package pattern.factory;

public abstract class Robot {
	public abstract String getName();
}
package pattern.factory;

public class SuperRobot extends Robot {
	@Override
	public String getName() {
		return "SuperRobot";
	}
}
package pattern.factory;

public class PowerRobot extends Robot {
	@Override
	public String getName() {
		return "PowerRobot";
	}
}

 

package pattern.factory;

public abstract class RobotFactory {
	abstract Robot createRobot(String name);
}

 

package pattern.factory;

public class SuperRobotFactory extends RobotFactory {
	@Override
	Robot createRobot(String name) {
		switch( name ){
			case "super": return new SuperRobot();
			case "power": return new PowerRobot();
		}
		return null;
	}
}
package pattern.factory;

public class ModifiedSuperRobotFactory extends RobotFactory {
	@Override
	Robot createRobot(String name) {
		try {
			Class<?> cls = Class.forName(name);
			Object obj = cls.newInstance();
			return (Robot)obj;
		} catch (Exception e) {
			return null;
		}
	}
}

 

package pattern.factory;

public class FactoryMain {
	public static void main(String[] args) {

		RobotFactory rf = new SuperRobotFactory();
		Robot r = rf.createRobot("super");
		Robot r2 = rf.createRobot("power");

		System.out.println(r.getName());
		System.out.println(r2.getName());

		RobotFactory mrf = new ModifiedSuperRobotFactory();
		Robot r3 =  mrf.createRobot("pattern.factory.SuperRobot");
		Robot r4 =  mrf.createRobot("pattern.factory.PowerRobot");

		System.out.println(r3.getName());
		System.out.println(r4.getName());
	}
}

 

 

여기서 잠깐) 클래스, 객체, 인스턴스의 차이

  • 클래스(Class) VS 객체(Object)
    클래스는 ‘설계도’, 객체는 ‘설계도로 구현한 모든 대상’을 의미한다.

 

  • 객체(Object) VS 인스턴스(Instance)
    클래스의 타입으로 선언되었을 때 객체라고 부르고, 그 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다.
    객체는 현실 세계에 가깝고, 인스턴스는 소프트웨어 세계에 가깝다.
    객체는 ‘실체’, 인스턴스는 ‘관계’에 초점을 맞춘다.
    객체를 ‘클래스의 인스턴스’라고도 부른다.
    ‘방금 인스턴스화하여 레퍼런스를 할당한’ 객체를 인스턴스라고 말하지만, 이는 원본(추상적인 개념)으로부터 생성되었다는 것에 의미를 부여하는 것일 뿐 엄격하게 객체와 인스턴스를 나누긴 어렵다.

 

  • 참고
    • 추상화 기법
      • 분류(Classification)
        객체 -> 클래스
        실재하는 객체들을 공통적인 속성을 공유하는 범부 또는 추상적인 개념으로 묶는 것
      • 인스턴스화(Instantiation)
        클래스 -> 인스턴스
        분류의 반대 개념. 범주나 개념으로부터 실재하는 객체를 만드는 과정
        구체적으로 클래스 내의 객체에 대해 특정한 변형을 정의하고, 이름을 붙인 다음, 그것을 물리적인 어떤 장소에 위치시키는 등의 작업을 통해 인스턴스를 만드는 것을 말한다.
        ‘예시(Exemplification)’라고도 부른다.



 

 

 

https://gmlwjd9405.github.io/2018/09/17/class-object-instance.html

 

[Java] 클래스, 객체, 인스턴스의 차이 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

팩토리 메서드 패턴 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)

 

팩토리 메서드 패턴 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

팩토리 메소드 패턴(Factory Method Pattern) :: JDM's Blog

 

팩토리 메소드 패턴(Factory Method Pattern) :: JDM's Blog

이번 포스팅은 팩토리 메소드 패턴Factory Method Pattern에 대해 알아보고자 합니다. Factory Method Pattern 기본적으로 팩토리는 공장이란 뜻을 내포하고 있습니다. 따라서 팩토리 메소드 패턴도 무언가

jdm.kr