1) 팩토리 메소드 패턴이란?
- 팩토리 메소드 패턴이란 어떤 인스턴스를 생성하는 책임을 구체 클래스가 아닌
추상적인 인터페이스의 메소드로 감싸는 것을 의미합니다.
- 다양한 구현체(Product)가 있고, 그 중에서 특정한 구현체를 만들 수 있는 다양한 팩토리(Creator)를
제공할 수 있습니다.
- 예를 들어, whiteship이라는 배만 만들던 공장이 있는데, 사업이 잘 되어서
추후에 blackship이라는 것도 만들게 됩니다.
이 때, 기존에 있던 orderShip 메소드에 if~else문으로 조건을 추가하면서 코드가 복잡해집니다.
혹은 Ship 클래스가 변경될 수도 있습니다.(즉, 변경에 닫혀 있지 않습니다)
-> 그래서 우리는 추상화되어 있는 Factory를 만듭니다.
-- 팩터리 메소드 패턴 사용 전 --
[Client 클래스]
public class Client{
public static void main(String[] args){
Client client = new Client();
Ship whiteship = ShipFactory.orderShip("whiteship", "keesun@gmail.com");
System.out.println(whiteship);
Ship blackship = ShipFactory.orderShip("blackship", "keesun@gmail.com");
System.out.println(blackship);
}
}
[Ship 클래스]
public class Ship{
private String name;
private String color;
private String logo;
public String getName() { return name; }
public void setName() { this.name = name; }
public String getColor() { return color; }
public void setColor() { this.color = color;}
public String getLogo() { return logo; }
public void setLogo() { this.logo = logo;}
}
[ShipFactory 클래스]
public class ShipFactory{
public static Ship orderShip(String name, String email){
if(name == null || name.isBlank()){
throw new IllegalArgumentException("배 이름을 지어주세요.");
}
if(email == null || email.isBlank()){
throw new IllegalArgumentException("연락처를 남겨주세요.");
}
Ship ship = new Ship();
ship.setName(name);
if(name.equalsIgnoreCase("whiteship")){
ship.setLogo("\u0830\uDEE5");
}else if(name.equalsIgnoreCase("blackship")){
ship.setLogo(" ");
}
if(name.equalsIgnoreCase("whiteship")){
ship.setColor("white");
}else if(name.equalsIgnoreCase("blackship")){
ship.setColor("black");
}
sendEmailTo(email, ship);
return ship;
}
}
-- 팩토리 메소드 패턴 적용 후--
[ShipFactory 인터페이스]
public interface ShipFactory{
default Ship orderShip(String name, String email){
validate(email);
prepareFor(name);
Ship ship = createShip();
sendEmailTo(email, ship);
return ship;
}
private void sendEmailTo(String email, Ship ship){
System.out.println(ship.getName() + " 다 만들었습니다.");
}
Ship createShip()
private void validate(String email){
if(name == null || name.isBlank()){
throw new IllegalArgumentException("배 이름을 지어주세요.");
}
if(email == null || email.isBlank()){
throw new IllegalArgumentException("연락처를 남겨주세요.");
}
}
}
[WhiteShipFactory 클래스]
public class WhiteShipFactory implements ShipFactory{
@Override
public Ship createShip(){
return new WhiteShip();
}
}
[WhiteShip 클래스]
public class Whiteship extends Ship{
public WhiteShip(){
setName("whiteship");
setLogo("\uD83D\uDEE5");
setColor("white");
}
}
[BlackshipFactory 클래스]
public class BlackshipFactory implements ShipFactory {
@Override
public Ship createShip(){
return new Blackship();
}
}
[Blackship 클래스]
public class Blackship extends Ship{
public Blackship(){
setName("blackship");
setColor("black");
setLogo("b");
}
}
[Client 클래스]
public class Client{
public static void main(String[] args){
Client client = new Client();
Ship whiteship = new WhiteshipFactory().orderShip("Whiteship", "keesun@gmail.com");
System.out.println(whiteship);
Ship blackship = new BlackshipFactory().orderShip("Blackship", "keesun@gmail.com");
System.out.println(blackship);
}
}
참고
백기선 코딩으로 학습하는 GoF의 디자인 패턴
'디자인 패턴' 카테고리의 다른 글
팩토리 메소드 패턴(3) - 자바와 스프링에서 찾아보는 패턴 (0) | 2022.09.01 |
---|---|
팩토리 메소드 패턴(2) - 인터페이스 적용하기, 장점과 단점 (0) | 2022.09.01 |
싱글톤 패턴(3) - 자바와 스프링에서 찾아보는 패턴 (0) | 2022.08.31 |
싱글톤 패턴(2) - 싱글톤 패턴을 깨뜨리는 방법, 안전하고 단순하게 구현하는 방법 (0) | 2022.08.31 |
싱글톤 패턴(1) - 싱글톤 패턴 단순 구현, 멀티 쓰레드 환경에서 구현 (0) | 2022.08.31 |