Factory method는 부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며. 자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다. 부모(상위) 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다...

팩토리 패턴에 사용되는 슈퍼클래스는 인터페이스나 추상 클래스, 혹은 그냥 평범한 자바 클래스여도 상관없다.
상위 슈퍼클래스를 만들고 PC와 Server라는 두 서브 클래스를 생성하여 상속을 받는다.
팩토리 클래스를 만든다.
팩토리 클래스의 역할은 type이 PC일 경우에는 PC클래스의 인스턴스를, Server일 때는 서버 클래스의 인스턴스를 리턴한다.
다시말해 파라미터를 필터링하여 그에 맞는 인스턴스를 리턴해 준다는 것이다.
이렇게 팩토리 메소드 패턴을 사용하게 되면 인스턴스를 필요로 하는 어플리케이션에서 컴퓨터의 sub클래스에 대한 정보는 모른 채 인스턴스를 생성할 수 있게 된다.
장점 : 개방 폐쇠 원칙을 잘 따르며 변경해야 할 부분과 변경하면 안될부분을 명확하게 나눌 수 있다.
단점 : 패턴을 구현할 많은 서브 클래스를 도입함으로써 코드가 복잡해 질 수 있다.

실행 코드
public class Main {
public static void main(String[] args) {
Computer pc = ComputerFactory.getComputer(new PCFactory("2 GB","500 GB","2.4 GHz"));
Computer server = ComputerFactory.getComputer(new ServerFactory("16 GB","1 TB","2.9 GHz"));
System.out.println("AbstractFactory PC Config::"+pc);
System.out.println("AbstractFactory Server Config::"+server);
}
}

추상 팩토리 패턴
장점 : 개방 폐쇠 원칙을 잘 따르며 변경해야 할 부분과 변경하면 안될부분을 명확하게 나눌 수 있다.
단점 : 패턴을 구현할 많은 서브 클래스를 도입함으로써 코드가 복잡해 질 수 있다.