KWSStudy
어댑터? 국산 플러그와 유럽식 소켓사이에서 국산 전원 플러그를 유럽식 소켓에 꽂을 수 있게 해주는 역할을 해주는 것. 어댑터 패턴(Adapter Pattern)의 정의 한 클래스(어떤)의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환합니다. 어탭터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있습니다. 어댑터는 클라이언트로부터 요청을 받아서 새로운 업체에서 제공하는 클래스에서 받아들일 수 있는 형태의 요청으로 변환시켜주는 중개인 역할을 합니다. 어댑티? -> 어댑터를 가운데 두고, 클라이언트와 정반대 위치에 있는것을 어댑티라고 부름.
커맨드 패턴의 정의 커맨드 패턴을 이용하면 요구 사항을 객체로 캡슐화 할 수 있으며, 매개변수를 써서 여러 가지 다른 요구 사항을 집어넣을 수도 있다. 또한 요청 내역을 큐에 저장하거나 로그로 기록할 수도 있으며, 작업취소 기능도 지원 가능하다. 커맨드 패턴의 목적 한 차원 높은 단계의 캡슐화. 즉 메소드 호출을 캡슐화하는 것. 메소드 호출을 캡슐화하면 계산 과정의 각 부분들을 결정화시킬 수 있기 때문에, 계산하는 코드를 호출한 객체에서는 어떤 식으로 일을 처리해야 하는지에 대해 전혀 신경쓰지 않아도 된다.
정의 어플리케이션에서 유일하게 존재하는 객체 싱글톤을 이용한 클래스는 new를 이용한 객체를 생성하지 못하고 클래스안의 getInstance() 메소드를 이용하여 객체를 가져온다.(명명규칙) java의 calendar = getInstance해도 새로운 객체를 만들어준다 고로 싱글톤이라할 수 없다 public static Calendar getInstance() { Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT)); cal.sharedZone = true; return cal; } private static Calendar createCalendar(TimeZone zone, Locale aLocale) { Calendar cal = null; String caltype = aLocale.getUnicodeLocaleType("ca"); if (caltype == null) { // Calendar type is not specified.
정의 알고리즘군(기능)을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 한다. 스트래티지 패턴을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다. 스트래티지 패턴의 적용 원칙 자주 바뀌는 부분(기능)을 바뀌지 않는 부분과 분리하여 캡슐화 한다. 상속 보다는 구성(멤버 변수?)을 활용한다. 구현이 아닌 인터페이스에 맞추어 프로그래밍 한다. 원칙을 무시한 코드 /* 모든 게시판이 만들어질때 상속 받을 슈퍼 클래스 / public class Article{ public boolean insertArticle(){ 입력을 구현 } public List selectArticle(){ 선택을 구현 } public boolean updateArticle(){ 수정을 구현 } } / Article을 상속 받은 SimpleArticle1 / public class SimpleArticle1 extend Article{ public List selectArticle(){선택을 구현} } / Article을 상속 받은 SimpleArticle2 / public class SimpleArticle2 extend Article{ public List selectArticle(){선택을 구현} } 게시판에 삭제기능도 필요 하다는 요구조건이 추가되어 최상위 클래스인 Article에 삭제기능을 추가 / 모든 게시판이 만들어질때 상속 받을 슈퍼 클래스 / public class Article{ public boolean insertArticle(){ 입력을 구현 } public List selectArticle(){ 선택을 구현 } public boolean updateArticle(){ 수정을 구현 } public boolean deleteArticle(){ 삭제를 구현 } } 이후 새로운 SimpleArticle3게시판을 추가했는데 해당 게시판은 글 삭제가 불가능한 게시판 / Article을 상속 받은 SimpleArticle3 / public class SimpleArticle3 extend Article{ public List selectArticle(){선택을 구현} public boolean deleteArticle(){ 아무것도 하지 않도록 구현 } } 새로운 SimpleArticle4게시판을 추가했는데 해당 게시판은 글 쓰기,수정,삭제가 불가능한 게시판 / Article을 상속 받은 SimpleArticle4 */ public class SimpleArticle4 extend Article{ public boolean insertArticle(){ 아무것도 하지 않도록 구현 } public List selectArticle(){ 선택을 구현 } public boolean updateArticle(){ 아무것도 하지 않도록 구현 } public boolean deleteArticle(){ 아무것도 하지 않도록 구현 } } 문제점 선택 이외의 기능들은 자주 변경이 일어남.
팩토리패턴 디자인패턴 중에서 생성 패턴(Creational Pattern)의 대표적인 패턴들이다. 팩토리 패턴의 종류 팩토리 메서드(Factory Method) 패턴 추상 팩토리(Abstract Factory) 패턴 시작하기전에 디자인 패턴에 포함되지는 않지만, 팩토리 패턴의 기본이 되는 팩토리 구조에 대해서 알아보자. 팩토리를 사용하는 이유 클라이언트에서 사용할 객체를 생성하는 부분을 캡슐화하여 느슨한 결합 상태로 만들어, 변화에는 닫혀있고 확장에는 열려있는 코드를 만들 수 있다. 변경 전의 코드 // Pizza 클래스의 객체의 생성 및 사용을 모두 수행하는 메서드 Pizza orderPizza(String type) { Pizza pizza; if (type.equals("cheese")) { pizza = new CheesePizza(); } else if (type.equals("greek")) { pizza = new GreekPizza(); } else if (type.equals("pepperoni")) { pizza = new PepperoniPizza(); } pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } 변경 후의 코드 // Pizza 클래스의 생성을 전담하는 클래스 = 팩토리 public class SimplePizzaFactory { public Pizza createPizza(String type) { Pizza = null; if (type.equals("cheese")) { pizza = new CheesePizza(); } else if (type.equals("greek")) { pizza = new GreekPizza(); } else if (type.equals("pepperoni")) { pizza = new PepperoniPizza(); } return pizza; } } SimplePizzaFactory factory = new SimplePizzaFactory(); // Pizza 객체의 생성은 팩토리에 맞기고 사용에 전념하는 메서드 Pizza orderPizza(String type) { Pizza pizza; pizza = factory.createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } 클래스 다이어그램 ##팩토리 메소드 (Factory Method) 객체를 생성하는 인터페이스를 정의하지만, 인스턴스를 만들 클래스의 결정은 서브클래스가 한다.