목적:
client에서 사용하는 코드를 인터페이스로 변경해서 사용하기 위해사용
관련된 인스턴스들을 하나로 모으는 역활을 한다.
BigBirdFactory에서 BigBird와 관련된 모든 인스턴스를 만들고 최종 BigBird인스턴스를 리턴해주는거 같이
추상 팩토리 패턴을 통해 캡슐화의 기능도 함
public interface BirdAbstractFactory {
Bird createBird();
}
public class BigBirdFactory implements BirdAbstractFactory {
private String name;
private String speed;
public BigBirdFactory(String name, String speed) {
this.name = name;
this.speed = speed;
}
@Override
public Bird createBird() {
return new BigBird(name, speed);
}
}
public class SmallBirdFactory implements BirdAbstractFactory {
private String name;
private String speed;
public SmallBirdFactory(String name, String speed) {
this.name = name;
this.speed = speed;
}
@Override
public Bird createBird() {
return new SmallBird(name, speed);
}
}
public class BirdFactory {
public static Bird getBird(BirdAbstractFactory birdAbstractFactory) {
return birdAbstractFactory.createBird();
}
}
public class Client {
public static void main(String[] args) {
Bird bigBird = BirdFactory.getBird(new BigBirdFactory("king", "500"));
Bird smallBird = BirdFactory.getBird(new SmallBirdFactory("queen", "1"));
System.out.println(bigBird);
System.out.println(smallBird);
}
}
강의 코드
public interface ShipPartsFactory { Anchor createAnchor(); Wheel createWheel(); }
위와 같이 인터페이스로 기능을 빼고,
public class WhitePartsProFactory implements ShipPartsFactory { @Override public Anchor createAnchor() { return new WhiteAnchorPro(); } @Override public Wheel createWheel() { return new WhiteWheelPro(); } }
위와 같이 해당 인터페이스를 구현한 WhitePartsProFactory를 만들어준다.
public class WhiteshipFactory extends DefaultShipFactory { private ShipPartsFactory shipPartsFactory; public WhiteshipFactory(ShipPartsFactory shipPartsFactory) { this.shipPartsFactory = shipPartsFactory; } @Override public Ship createShip() { Ship ship = new Whiteship(); ship.setAnchor(shipPartsFactory.createAnchor()); ship.setWheel(shipPartsFactory.createWheel()); return ship; } }
ShipPartsFactory
를 구현한 클래스가 누구냐에 따라 Anchor와 Wheel은 바뀔수가 있게됨 그러면서 동시에ship.setAnchor(shipPartsFactory.createAnchor());
와ship.setWheel(shipPartsFactory.createWheel());
는 소스코드의 변경이 없게 된다.public class ShipInventory { public static void main(String[] args) { ShipFactory shipFactory = new WhiteshipFactory(new WhiteshipPartsFactory()); Ship ship = shipFactory.createShip(); System.out.println(ship.getAnchor().getClass()); System.out.println(ship.getWheel().getClass()); } }
팩토리 메소드 패턴
- 인스턴스를 만드는(객체를 만드는) 과정에 좀더 집중 되어있음 ⇒ 추상화되어있음
- 팩토리를 구현하는 방법에 초점
- 구체적인 객체 생성 과정을 하위 또는 구체적인 클래스로 옮기는것이 목적
추상 팩토리 패턴
- 팩토리를 사용하는 방법에 초점
- 관련이있는 여러 객체를 구체적인 클레스에 의존하지 않고 만들 수 있게 해주는것이목적