※ src/main/java 폴더에 xyz.itwill01.old 패키지 생성
📢 결합도가 높은면 안좋은점!!
- 클래스 하나를 수정하면 다른 묶여있는 클래스도 수정해야함
- 비효율적
📃HelloMessageObject.java
※ xyz.itwill01.old 패키지에 HelloMessageObject.java 클래스 생성
package xyz.itwill01.old; // public class HelloMessageObject { public String getHelloMessage() { return "Hello!!!"; } }
📃MessagePrint.java
※ xyz.itwill01.old 패키지에 MessagePrint.java 클래스 생성
package xyz.itwill01.old; // public class MessagePrint { public void helloMessagePrint() { HelloMessageObject object=new HelloMessageObject(); String message=object.getHelloMessage(); System.out.println("message = "+message); } //Hi를 출력하기 위해 코드 뜯어고쳐야함 public void hiMessagePrint() { HiMessageObject object=new HiMessageObject(); String message=object.getHiMessage(); System.out.println("message = "+message); } }
📃MessagePrintApp.java
※ xyz.itwill01.old 패키지에 MessagePrintApp.java 클래스 생성
package xyz.itwill01.old; // public class MessagePrintApp { public static void main(String[] args) { MessagePrint print=new MessagePrint(); //print.helloMessagePrint(); print.hiMessagePrint(); } }
📢Hi!!! 메세지를 출력하기 위해서 2개의 클래스 수정함
📃HiMessageObject.java
※ xyz.itwill01.old 패키지에 HiMessageObject.java 클래스 생성
package xyz.itwill01.old; // public class HiMessageObject { public String getHiMessage() { return "Hi!!!"; } }
※ src/main/java 폴더에 xyz.itwill02.factory 패키지 생성
📢인터페이스를 상속받은 클래스는 반드시 인터페이스에 작성된 모든 추상메소드를 오버라이드 선언
→ 인터페이스를 상속받은 클래스에 메소드 작성 규칙 제공 - 인터페이스 : 작업명세서 역활📢인터페이스로 참조변수를 생성하면 참조변수에는 인터페이스를 상속받은 모든 자식클래스의 객체를 저장 가능
→ 인터페이스로 생성된 참조변수로 추상메소드를 호출하면 참조변수에 저장된 자식클래스 객체의 오버라이드 메소드가 호출 - 오버라이드에 의한 다형성 : 객체간의 결합도 감소📃MessageObject.java(인터페이스)
※ xyz.itwill02.factory 패키지에 MessageObject.java 인터페이스 생성
package xyz.itwill02.factory; // //인터페이스를 상속받은 클래스는 반드시 인터페이스에 작성된 모든 추상메소드를 오버라이드 선언 //→ 인터페이스를 상속받은 클래스에 메소드 작성 규칙 제공 - 인터페이스 : 작업명세서 역활 //인터페이스로 참조변수를 생성하면 참조변수에는 인터페이스를 상속받은 모든 자식클래스의 객체를 저장 가능 //→ 인터페이스로 생성된 참조변수로 추상메소드를 호출하면 참조변수에 저장된 자식클래스 객체의 오버라이드 메소드가 호출 - 오버라이드에 의한 다형성 : 객체간의 결합도 감소 public interface MessageObject { String getMessage(); }
📢Factory 클래스에 의해 생성되어 제공되는 클래스는 반드시 인터페이스를 상속받아 작성
📃HelloMessageObject.java(클래스)
※ xyz.itwill02.factory 패키지에 HelloMessageObject.java 클래스 생성
package xyz.itwill02.factory; // //Factory 클래스에 의해 생성되어 제공되는 클래스는 반드시 인터페이스를 상속받아 작성 public class HelloMessageObject implements MessageObject {//Add unimplemented methods 클릭해서 오버라이드 생성 @Override public String getMessage() { // TODO Auto-generated method stub return "Hello!!!"; } }
📢Factory 디자인 패턴을 이용하여 작성된 클래스 - Factory 클래스 또는 Provider 클래스
→ 프로그램 개발에 필요한 객체를 생성하여 제공하는 기능의 클래스 - 컨테이너(Container)📃MessageObjectFactory.java(클래스)
※ xyz.itwill02.factory 패키지에 MessageObjectFactory.java 클래스 생성
package xyz.itwill02.factory; // //Factory 디자인 패턴을 이용하여 작성된 클래스 - Factory 클래스 또는 Provider 클래스 //→ 프로그램 개발에 필요한 객체를 생성하여 제공하는 기능의 클래스 - 컨테이너(Container) public class MessageObjectFactory { private static MessageObjectFactory _factory; // private MessageObjectFactory() {//생성자를 은닉화(public → private) // TODO Auto-generated constructor stub } // static { _factory=new MessageObjectFactory(); } // public static MessageObjectFactory getFactory() { return _factory; } // //Factory 클래스에 의해 제공될 객체를 구분하기 위한 상수(Constant) public static final int HELLO_MSG=1; public static final int HI_MSG=2;//HI!!! 메세지 출력을 위해서 추가 // //매개변수로 전달받은 값을 비교하여 프로그램 개발에 필요한 객체를 생성하여 반환하는 메소드 public MessageObject getMessageObject(int messageObject) { MessageObject object=null; switch (messageObject) { case HELLO_MSG: object=new HelloMessageObject(); break; case HI_MSG://HI!!! 메세지 출력을 위해서 추가 object=new HiMessageObject(); break; } return object; } }
📃MessagePrint.java(클래스)
※ xyz.itwill02.factory 패키지에 MessagePrint.java 클래스 생성
package xyz.itwill02.factory; // public class MessagePrint { public void messagePrint() { //객체를 직접 생성하여 메소드 호출 - 객체간의 결합도가 높아 유지보수의 효율성 감소 //MessageObject object=new HelloMessageObject();//결합도가 높아짐 // //필요한 객체를 Factory 클래스로부터 제공받아 메소드 호출 - IoC(Inversion of Control) //→ IoC(Inversion of Control) : 객체간의 결합도를 낮춰 유지보수의 효율성 증가 //MessageObject object=MessageObjectFactory.getFactory().getMessageObject(1); MessageObject object=MessageObjectFactory.getFactory().getMessageObject(2);//HI!!! 메세지 출력을 위해서 추가 // //인터페이스로 생성된 참조변수의 추상메소드를 호출한 경우 참조변수에 저장된 자식클래스 객체의 오버라이드 메소드 호출 - 묵시적 객체 형변환 : 오버라이드에 의한 다형성 String message=object.getMessage(); System.out.println("message = "+message); } }
📃MessagePrintApp.java(클래스)
※ xyz.itwill02.factory 패키지에 MessagePrintApp.java 클래스 생성
package xyz.itwill02.factory; // public class MessagePrintApp { public static void main(String[] args) { MessagePrint print=new MessagePrint(); print.messagePrint(); } }
📢Hi!!!을 출력하기 위해 위에 코드 수정
1. MessageObjectFactory.java
2. MessagePrint.java📃HiMessageObject.java(클래스)
※ xyz.itwill02.factory 패키지에 HiMessageObject.java 클래스 생성
package xyz.itwill02.factory; // public class HiMessageObject implements MessageObject { @Override public String getMessage() { // TODO Auto-generated method stub return "Hi!!!"; } }