학습목표 l 추상팩토리패턴과그적용 l 빌더패턴과그적용 l 실습문제 2

Similar documents
JAVA PROGRAMMING 실습 08.다형성

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

PowerPoint Presentation

DocsPin_Korean.pages

PowerPoint Presentation

Design Issues

PowerPoint Presentation

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

Microsoft PowerPoint - 11_DesignPatterns(2010).ppt [호환 모드]

쉽게 풀어쓴 C 프로그래밍

rmi_박준용_final.PDF

Microsoft PowerPoint - 04-UDP Programming.ppt

제11장 프로세스와 쓰레드

PowerPoint Presentation

gnu-lee-oop-kor-lec06-3-chap7

PowerPoint Presentation

17장 클래스와 메소드

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - 2강

PowerPoint Presentation

09-interface.key

JMF3_심빈구.PDF

PowerPoint 프레젠테이션

제8장 자바 GUI 프로그래밍 II

Microsoft PowerPoint - Java7.pptx

설계란 무엇인가?

JAVA PROGRAMMING 실습 05. 객체의 활용

PowerPoint Template

01-OOPConcepts(2).PDF

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

어댑터뷰

소프트웨어공학 Tutorial #2: StarUML Eun Man Choi

오버라이딩 (Overriding)

자바GUI실전프로그래밍2_장대원.PDF

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

(Microsoft PowerPoint - 11_DesignPatterns\(2008\).ppt [\310\243\310\257 \270\360\265\345])

C# Programming Guide - Types

Java Programing Environment

PowerPoint 프레젠테이션

학습목표 l 생성패턴 l 동기, 목적 l 종류 l 팩토리패턴과그적용 l 싱글톤패턴과그적용 l 프로토타입패턴과그적용 l 실습문제 2

유니티 변수-함수.key

Microsoft PowerPoint - 11주차_Android_GoogleMap.ppt [호환 모드]

fundamentalOfCommandPattern_calmglow_pattern_jstorm_1.0_f…

Spring Boot/JDBC JdbcTemplate/CRUD 예제

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 02. 표준 입출력

ThisJava ..

슬라이드 1

Contents. 1. PMD ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 2. Metrics ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 3. FindBugs ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 4. ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

class Sale void makelineitem(productspecification* spec, int qty) SalesLineItem* sl = new SalesLineItem(spec, qty); ; 2. 아래의액티비티다이어그램을보고 Java 또는 C ++,

05-class.key

Microsoft PowerPoint 장강의노트.ppt

PowerPoint Presentation

ilist.add(new Integer(1))과 같이 사용하지 않고 ilist.add(1)과 같이 사용한 것은 자바 5.0에 추가된 기본 자료형과 해당 객체 자료 형과의 오토박싱/언박싱 기능을 사용한 것으로 오토박싱이란 자바 컴파일러가 객체를 요구하는 곳에 기본 자료형

슬라이드 1

Microsoft PowerPoint - Chap12-OOP.ppt

PowerPoint 프레젠테이션

작성자 : 김성박\(삼성 SDS 멀티캠퍼스 전임강사\)

비긴쿡-자바 00앞부속

Secure Programming Lecture1 : Introduction

C++ Programming

No Slide Title

슬라이드 1

02 C h a p t e r Java

Spring Data JPA Many To Many 양방향 관계 예제

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft PowerPoint - Lect04.pptx

파일로입출력하기II - 파일출력클래스중에는데이터를일정한형태로출력하는기능을가지고있다. - PrintWriter와 PrintStream을사용해서원하는형태로출력할수있다. - PrintStream은구버전으로가능하면 PrintWriter 클래스를사용한다. PrintWriter

PowerPoint Template

JAVA PROGRAMMING 실습 05. 객체의 활용

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

PowerPoint Template

Microsoft PowerPoint - C++ 5 .pptx

K&R2 Reference Manual 번역본

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일

2장 변수와 프로시저 작성하기

MVVM 패턴의 이해

PowerPoint Template

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

2) 활동하기 활동개요 활동과정 [ 예제 10-1]main.xml 1 <LinearLayout xmlns:android=" 2 xmlns:tools="

PowerPoint Presentation

Microsoft PowerPoint - RMI.ppt

PowerPoint Presentation

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

Microsoft PowerPoint - 06-Chapter09-Event.ppt

Interstage5 SOAP서비스 설정 가이드

C++ Programming

쉽게 풀어쓴 C 프로그래밍

No Slide Title

Network Programming

C++ Programming

슬라이드 1

Transcription:

객체지향설계와패턴 Lecture #10: 생성패턴 (2) Eun Man Choi emchoi@dgu.ac.kr

학습목표 l 추상팩토리패턴과그적용 l 빌더패턴과그적용 l 실습문제 2

Pattern #4 추상팩토리패턴 구체적인클래스의명시없이관련객체의패밀리를 생성하기위한인터페이스를제공하기위하여사용 l 목적 l 결과 l 객체생성을추상화하여이를사용하는모듈과독립적으로인터페이스를정의하는데있다. l 인스턴스를생성하기위한프레임워크와실제로인스턴스를생성하는클래스를분리하여생각 l 패밀리에있는각클래스의팩토리메소드를가진클래스에서패밀리를생성 3

추상팩토리패턴 : Motivation 당신은상용에디터프로그램의사용자인터페이스부분의개발을맡았다. 시장을넓히기위하여, 이프로그램은 MS- Windows GUI환경과리눅스의 Motif GUI환경을지원하여야한다. 하나의프로그램소스코드에서두가지 GUI를지원하려면? NotePad 파일편집서식도움말 MS-Windows Motif Editor 프로그램 4

Motivation l 각 GUI 플랫폼을위한코드 * MSWindow *win = new MSWindow; MSScrollbar *scrollbar = new MSScrollbar; MSMenu *menu = new MSMemu; MSMenuItem *i1 = new MSMenuItem; win->addscrollbar(scrollbar); menu->additem(i1); win->addmenu(menu); MotifWindow *win = new MotifWindow; MotifScrollbar *scrollbar = new MotifScrollbar; MotifMenu *menu = new MotifMemu; MotifMenuItem *i1 = new MotifMenuItem; win->addscrollbar(scrollbar); menu->additem(i1); win->addmenu(menu);? use Abstract Factory * 여기에서제시된코드는설계패턴의이해를돕기위해가상으로작성된코드로서, 실제 MS-windows와 Motif GUI 를위한코드와는다름. 5

Motivation #ifdef MSWINDOWS GUIFactory *factory = new MSFactory; #elif GUIFactory *factory = new MotifFactory; #end MS-Window GUI 를위한 factory Motif GUI 를위한 factory Window *win = factory->createwindow(); Scrollbar *scrollbar = factory->createscrollbar(); Menu *menu = factory->createmenu(); MenuItem *i1 = factory->createmenuitem(); win->addscrollbar(scrollbar); menu->additem(i1); win->addmenu(menu); 6

Motivation 7

추상팩토리패턴 l 의도 l 별칭 l 구체적인클래스를미리정하지않고, 상호관련있는객체들의패밀리 (family) 를생성하는인터페이스를제공한다. l Kit l 적용 l 시스템이, 내부에사용되는 product들의생성과조합에독립적일필요가있을경우에사용. l 시스템이몇개의제품군 (product family) 중하나를선택하여환경설정될때사용 l 특정제품군이선택되면, 해당제품군내의제품 (product) 들만사용되도록강제할필요가있을경우 8

추상팩토리패턴 9

추상팩토리패턴 l 구성요소 l AbstractFactory (GUIFactory) product 를생성하는연산에대한 interface 를선언 l ConcreteFactory (MSFactory, MotifFactory) 실제 product 를생성기능담당 l AbstractProduct (Window, Scrollbar) 각 product 종류별로필요한연산들에대한 interface 를선언 l ConcreteProduct (MotifWindow, MotifScrollbar) 실제생성되고수행되는 product l Client AbstractFactory 와 AbstractProduct 에정의된 interface 부분만사용 ( 초기에 ConcreteFactory 를지정하는부분은제외 ) 10

추상팩토리패턴 l Collaboration l 일반적으로실행시 (run-time), 단한개의 ConcreteFactory 객체만생성된다. l Client 코드에서는이 Factory 객체를이용하여원하는 product 객체를생성하여활용한다. l 만일다른 family 의 product 를생성하기원한다면해당 family 의 ConcreteFactory 객체를사용하여야한다. #ifdef MSWINDOWS GUIFactory *factory = new MSFactory; #elif GUIFactory *factory = new MotifFactory; #end Window *win = factory->createwindow(); 11

추상팩토리패턴 l 결과 l 추상성을높인다 Client Code 에서는구체적 Product 클래스를모름 l Product family 교환이쉽다. 초기 ( 혹은실행시 ) 에 ConcreteFactory 를바꿈으로써원하는제품군 (product family) 으로쉽게교환이가능하다. l Product 간의일관성을증진시킨다. 사용되는 product 들이같은 factory 에서생성되기때문에동일한 product family임이보장된다. l 새로운종류의 Product family 를추가하기쉽다. ( 여기서쉽다는말은기존코드의수정이필요없다는의미 ) l 새로운종류의 Product 추가는힘들다. ( 기존코드의변경필요 ) 12

추상팩토리패턴 l 구현 1. 일반적으로각 product family 별로단하나의 ConcreteFactory 객체만필요하다. 이를보장하기위하여 Singleton pattern 을사용할수있다. 2. 만일많은 product family 들이사용된다면, ConcreteFactory 는 Prototype pattern 을이용하여구현될수있다. 3. AbstractFactory 에서각 product 객체마다이를생성하는함수 create??() 를따로제공한다. 이때문에새로운 product Y 를각 product family 에추가할경우에는기존의모든 Abstract/Concrete Factory 들의연산에 createy() 를추가하여야한다. 이러한문제점을해결하기위한대안으로는 product 종류를인자로받아해당 product 객체를생성하는 create(??) 연산하나를두는방법이있다. 이방법의문제점은? 13

사례 1: 미로게임 l 앞에나온 Maze 소스코드에 Abstract Factory 를적용하여 마법의미로 나 폭탄미로 를만들수있는코드개발. l 기존 Maze 코드에서 MapSite, Room, Door, Wall 의코드그대로사용 l 추가되는 classes l MazeFactory, l EnchantedMazeFactory, EnchantedRoom, DoorNeedingSpell l BombedMazeFactory, BombedWall, RoomWithABomb l 변경되는부분 l MazeGame::CreateMaze() 14

미로게임코드 class MazeFactory { public: MazeFactory(); virtual Maze* MakeMaze() const; virtual Wall* MakeWall() const; virtual Room* MakeRoom(int n) const; virtual Door* MakeDoor(Room* r1, Room* r2) const; protected: static MazeFactory* _instance; ; class BombedMazeFactory : public MazeFactory { public: BombedMazeFactory(); virtual Wall* MakeWall() const { return new BombedWall; virtual Room* MakeRoom(int n) const { return new RoomWithABomb(n); ; class BombedWall { ; class RoomWithABomb { ; class EnchantedRoom { ; class DoorNeedingSpell { ; class EnchantedMazeFactory : public MazeFactory { public: EnchantedMazeFactory(); virtual Room* MakeRoom(int n) const { return new EnchantedRoom(n, CastSpell()); virtual Door* MakeDoor(Room* r1, Room* r2) const { return new DoorNeedingSpell(r1, r2); 15 protected: Spell* CastSpell() const; ;

미로게임코드 Maze* MazeGame::CreateMaze (MazeFactory& factory) { Maze* amaze = factory.makemaze(); Room* r1 = factory.makeroom(1); Room* r2 = factory.makeroom(2); Door* adoor = factory.makedoor(r1, r2); amaze->addroom(r1); amaze->addroom(r2); r1->setside(north, factory.makewall()); r1->setside(east, adoor); r1->setside(south, factory.makewall()); r1->setside(west, factory.makewall()); r2->setside(north, factory.makewall()); r2->setside(east, factory.makewall()); r2->setside(south, factory.makewall()); r2->setside(west, adoor); // Client Code MazeGame game; BombedMazeFactory factory; game.createmaze(factory); 16 return amaze;

추상팩토리 l Known Uses l InterView system: Kit 를접미사로사용하여추상팩토리를표시 (WidgetKit, DialogKit, LayoutKit, ) l ET++ system: 서로다른 GUI 환경으로의이동성을위하여여러윈도우시스템 (X Windows, SunView, ) 에대한추상팩토리를이용 l 관련패턴 l 추상팩토리는주로팩토리메소드패턴방식으로구현되지만, 프로토타입패턴을이용하여구현될수도있다. l 하나의 ConcreteFactory 객체를생성하기위하여싱글톤패턴을사용할수있다. 17

사례 2: 정원만들기 l 정원꾸미기 l 정원 (garden): 중앙, 경계, 그늘진곳 다년생, 야채, 동물, 식물 l 식물 (plant): l GardenMaker l getgarden(string gtype) 을이용하여요구하는객체를생성 18

사례 2: 정원만들기 Garden getshade() getcenter() getborder() abstractfactory 1 GardenMaker getgarden() <<create>> PerennitialGarden AnnualGarden VegieGarden 19 Client

정원만들기코드 l 정원 public abstract class Garden { public abstract Plant getshade(); public abstract Plant getcenter(); public abstract Plant getborder(); 20 public class PerennialGarden extends Garden { public Plant getshade() { return new Plant("Astilbe"); public Plant getcenter() { return new Plant("Dicentrum"); public Plant getborder() { return new Plant("Sedum");

정원만들기코드 l 식물 public class Plant { String name; public Plant(String pname) { name = pname; //save name public String getname() { return name; l GardenMaker class GardenMaker { private Garden gd; public Garden getgarden(string gtype) { gd = new VegieGarden(); if (gtype.equals("perennial")) gd = new PerennialGarden(); if (gtype.equals("annual")) gd = new AnnualGarden(); return gd; 21

사례 3: 워드프로세서입력 ---> Enter title: My Life ---> Enter text: I grew up playing in the woods ---> Enter Heading or -done : Birth ---> Enter text: I was born in a small mountain hut. ---> Enter Heading or -done : Youth ---> Enter Heading or -done : Adulthood. ---> Enter Heading or -done : -done (continued) 22

워드프로세서출력. >> Enter the style you want displayed: big. >> Enter the style you want displayed: small ----- Title: MY LIFE ----- Option 1 My Life Option 2 Section 1. --- BIRTH --- I was born in a mountain hut. Section 2. --- YOUTH --- I grew up sturdy Section 3. --- ADULTHOOD ---. Birth I was born in a mountain hut. Youth I grew up sturdy Adulthood 23

클래스모델 Document setstyle() display() 1 Style SmallStyle LargeStyle....... Client Application of Abstract Factory 24

Document getaheading() getatitle() grtdocumentfromuser() Text value 0..n Displayable 0..n Heading value 1 Displayable display() Title value style Style getaheading() getatitle() SmallHeading display() LargeHeading display() SmallTitle display() LargeTitle display() «create» SmallStyle getaheading() getatitle() LargeStyle getaheading() getatitle() Abstract Factory Applied to Word Processor 25 Client getstylefromuser() displaydocument()

워드프로세서코드 : Document 클래스 26 public class Document { private String title; private Vector headings = new Vector(); private Vector textsegments = new Vector(); private Vector display = new Vector(); private Style style; private static Document thedocument = new Document(); public Document() { super(); public void builddisplay() { display.addelement(getatitle(title)); for (int i = 0; i < headings.size(); ++i) { String heading = (String) headings.elementat(i); display.addelement(getaheading(heading, i + 1));..

워드프로세서코드 : Style 클래스 public abstract class Style { public Style() { super(); public abstract Heading getaheading(string astring, int anindex); public abstract Title getatitle(string astring); 27

워드프로세서코드 : SmallHeading 클래스 public class SmallHeading extends Heading { public void display() { System.out.println("\n" + value.tolowercase() + ":"); public SmallHeading() { super(); public SmallHeading(String astring, int anindex) { super(astring, anindex); 28

워드프로세서코드 : SmallStyle 클래스 public class SmallStyle extends Style { private static SmallStyle thesmallstyle = new SmallStyle(); 29 private SmallStyle() { super(); public Heading getaheading(string astring, int anindex) { return new SmallHeading(aString, anindex); public Title getatitle(string astring) { return new SmallTitle(aString); public static Style getthesmallstyle() { return thesmallstyle;

Pattern #5 빌더패턴 l 목적 l 객체의 construction 과정과객체의 representation 을분리 l 이렇게분리함으로써하나의 construction 과정을이용하여서로다른형태의 representation 을생성할수있음 복잡한객체의생성루틴을객체의표현과분리하기위한 패턴 30

빌더패턴 : Motivation RTF(Rich Text Format) 문서파일을읽어서다른형태 (MS-Word, HWP, ASCII, ) 의문서로변환하는프로그램을개발하여야한다. 어떻게설계하는것이좋을까? MS-Word RTF file 어떤방식으로변환을?? HWP ASCII file 31

빌더패턴 : Motivation l RTF Reader 는세부파일포맷을위한 Builder(MS-Word Builder, HWP Builder, ) 를직접접근하지않는다. MS-Word MS-Word Builder RTF file RTF Reader Builder HWP Builder HWP ASCII Builder ASCII file 32

빌더패턴 : Motivation 33

빌더패턴 : Motivation l RTF 파일을읽어분석하는 ParseRTF() 내에서는 builder 가어떤객체인지와는상관없이변환작업을수행 l 각빌더들 (ASCIIBuilder, MSWordBuilder, ) 은고유의파일포맷에 맞추어 Text 객체를생성하고구축한다. l 빌더는 reader 와분리됨 l RTF Reader 는 RTF 문서를파싱하는일에책임 l 각빌더는텍스트파일을생성하고조합하는일에책임 34

빌더패턴 l 구조 35

빌더패턴의요소 l 참여클래스 l 빌더 (TextBuilder) product 객체의각부분을구축하는인터페이스선언 l ConcreteBuilder(ASCIIBuilder, MSWordBuilder, HWPBuilder) product 객체의각부분을구축하는기능수행 다만들어진 product 객체를반환하는연산제공 (getasciitext(), getmswordtext(), gethwptext()) l Director(RTFReader) builder interface 를이용하여객체를구성 (construct) l Product(ASCIIText, MSWordText, HWPText) construction 과정을통하여생성되는복잡한객체 36

빌더배턴의사용 l Collaborations l 클라이언트부분에서 director 객체를생성하고, 원하는객체를구축하는빌더객체를지정한다. l Director 는 product 의각부분이구축되어야할시점에이를 builder 에게알려준다. l 빌더는 director 의통보에따라 product 에해당부분을추가한다. l 클라이언트는빌더로부터구축이완료된 product 객체를얻는다. l 팩토리패턴과다른점 l 팩토리패턴 : 그룹으로묶어서생성되고반환되는객체들이어느정도정해진상태 l 빌더패턴 : 묶여지지않은상태에서객체를생성반환 37

빌더배턴의 Collaboration 38

사례 #1: 주식투자 l 사용자선택 l 주식, 채권, 뮤추얼펀드 l 선택을위한디스플레이 l 3 개이하 : 체크박스 l 3 개초과 : 리스트박스 39

설계 Client ChoieFactory MultipleChoice getgui() concretebuilder ListBoxChoice getgui() CheckBoxChoice getgui() etc. 40

코드 abstract class multichoice { public multichoice(vector choicelist) { choices = choicelist; abstract public Panel getui(); abstract public String[] getselected(); abstract public void clearall(); 41

코드 class listboxchoice extends multichoice { public string[] getselect() { List list; int count = 0; For(int i = 0; i < list.getitemcount(); public listboxchoice(vector choices) { i++) { super(choices); if (list.isindexselected(i)) count++; String[] slist = new String[count]; public Panel getui() { int j = 0; panel p = new Panel(); for (int i = 0; i < list.getitemcount(); list = new List(choices.size()); i++) { list.setmultiplemode(true); if (list.isindexselected(i)) p.add(list); slist[j++] = list.getitem(i); for (int i = 0; i < choices.size(); i++) list.additem( (String) choices.elementat(i)); return (slist); return p; 42

코드 class choicefactory { multchoice ui; public multichoice getchoiceui(vector choices) { if (choices.size() <= 3) ui = new checkboxchoice(choices); else ui = new listboxchoice(choices); return ui; pubic wealthbuilder() { choicefactory cfact = new choicefactory; multichoice mchoice; private void stocklist_click() { mchoice = cfact.getchoiceui(v); choicepanel.add(mchoice.getui()); 43

실습 #6: 추상팩토리, 빌더패턴 l 목적 l 추상팩토리패턴의이해와적용 l 기초지식 l 추상팩토리패턴은객체의구체적클래스를명시하지않고서그객체와관계된혹은의존하고있는그룹들을생성하는인터페이스를제공한다. l 설치및준비사항 l JDK( 또는 SDK), 자바에디터 l 실습과제를수행하기위한절차 l 문서를 Table 형식으로작성하기위한 TableFactory 클래스와 List 형식으로만드는 ListFactory 클래스를구현한다. HTML 문서를작성하고문자열을처리하는 Item 클래스와그것을상속받는 Tary 클래스를구현한다. 44

Step 1: 문제이해및 UML 설계 l 클래스 다이어그램 framework 구체적인클래스 45

Questions?