LECTURE 11 디자인패턴
설계작업에대한도전 소프트웨어설계는어려운일 문제를잘분할하고 유연하고잘모듈화된우아한디자인이되어야함 설계는시행착오 (trial and error) 의결과 성공적인설계가존재 두설계가똑같은일은없음 반복되는특성 2
디자인패턴 디자인패턴은공통된소프트웨어문제에오래동안사용되어검증된솔루션 디자인작업에사용되는공통언어. 의사소통을향상시키며구현, 문서화에도움 패턴은전문기술을담고있고그것을전수시킬수있음 3
참고자료 디자인패턴참고웹사이트 http://sourcemaking.com/design_patterns 4
Gangs of Four(GoF) 패턴 생성패턴 ( 추상객체인스턴스화 ) 추상팩토리, 팩토리, 빌더, 프로토타입, 싱글톤 구조패턴 ( 객체결합 ) 어뎁터, 브리지, 컴포지트, 데코레이터, 퍼싸드, 플라이웨이트, 프록시 행위패턴 ( 객체간커뮤니케이션 ) 책임체인, 커맨드, 인터프리터, 반복자 (iterator), 중재자, 메멘토, 옵서버, 상태, 전략 (stretegy), 템플릿메소드, 비지터 5
LECTURE 11 싱글톤패턴 클래스가하나의객체만을생성 6
객체의생성을제한 문제 : 클래스의객체를하나만만들어야하는경우가있음 두개이상만들면안되게하고싶을때 예 : 키보드리더, 프린터스풀러, 점수기록표 고려해야하는이유 객체를많이만드는것은시간이많이걸림 잉여객체는메모리낭비 여러가지다른객체가메모리에떠도는것은유지보관에골치덩어리 7
싱글톤패턴 싱글톤 : 그타입의유일한객체 많아야하나의인스턴스를가짐을보장 인스턴스에대하여어디서든접근할수있게하여야 프로그래머가인스턴스를없애버리는 ( 또는더생성할 ) 관리책무는빼앗음 사용자에게유일한인스턴스를접근할수있는메소드를제공 많이알려진디자인패턴중의하나 8
싱글톤패턴의구현 생성자를밖에서부르지못하도록 private 으로만든다. 클래스안에클래스의인스턴스를 static private 으로선언 단일인스턴스를접근할수있는 public getinstance() 나유사메소드를둔다. 이메소드는다중스레드로도실행될수있기때문에보호되어야하고동기화되어야 9
싱글톤순서다이어그램 10
싱글톤예 난수를만들어내는 RandomGenerator 를싱글톤으로만들어보자 public class RandomGenerator { private static RandomGenerator gen = new RandomGenerator(); public static RandomGenerator getinstance() { return gen; } private RandomGenerator() {}... } 이프로그림의문제점은? 11
싱글톤사례 2 필요할때까지는객체를만들지않는다. public class RandomGenerator { private static RandomGenerator gen = null; public static RandomGenerator getinstance() { if (gen == null) { gen = new RandomGenerator(); } return gen; }... } 이버전의문제점은? 12
싱글톤사례 3 Locking 으로병렬처리의문제점해결 public class RandomGenerator { private static RandomGenerator gen = null; public static synchronized RandomGenerator getinstance() { if (gen == null) { gen = new RandomGenerator(); } return gen; }... } 이버전의또다른문제점은? 13
싱글톤패턴사례 4 불필요한 Locking 없이병렬처리의문제점해결 public class RandomGenerator { private static RandomGenerator gen = null; public static RandomGenerator getinstance() { if (gen == null) { synchronized (RandomGenerator.class) { // must test again -- can you see why? // sometimes called test-and-test-and-set if (gen == null) { gen = new RandomGenerator(); } } }... } return gen; 14
싱글톤연습 프로젝트문제에서싱글톤이적용될부분은? 15
LECTURE 11 11 팩토리패턴 ( 팩토리메소드, 추상팩토리 ) 객체를쉽게생성하는클래스나메소드 16
팩토리패턴 팩토리 : 다른클래스의인스턴스를쉽게생성하고리턴하는임무를가진클래스 생성자를부르는대신팩토리클래스의정적메소드를사용하여객체를셋업 구축정보를사용정보에서분리 ( 응집을높이고결합을약하게하기위하여 ) 하여객체의생성과관리를쉽게 서브클래스의인스턴스화를지연하는효과 17
사용과생성을분리 18
팩토리순서다이어그램
팩토리구현 필요한팩토리를만드는방법 팩토리자체를인스턴스로만들어야 Private 생성자로 팩토리는컴포넌트를생성할때 static 메소드를사용 팩토리는인터페이스를가능하면간단하게만들어클라리언트가쉽게부르도록해야 20
팩토리사례 public class ImageReaderFactory { public static ImageReader createimagereader( InputStream is ) { int imagetype = figureoutimagetype( is ); switch( imagetype ) { case ImageReaderFactory.GIF: return new GifReader( is ); case ImageReaderFactory.JPEG: return new JpegReader( is ); // etc. } } } 21
LECTURE 11 데코레이터패턴 유용한기능을추가하기위하여다른객체를싸고있는객체
데코레이터패턴 데코레이터 : 다른객체의행위를바꾸거나기능을추가하는객체 객체에동적으로책무를추가 데코레이션당하는객체가데코이터를알지못함 데코레이터는랩핑하려는객체에통일된인터페이스를제공해야 23
데코레이터사례 : GUI 24
데코레이터객체의사용 Widget* awidget = new BorderDecorator( new HorizontalScrollBarDecorator( new VerticalScrollBarDecorator( new Window(80, 24)))); awidget->draw(); 25
LECTURE 11 퍼싸드패턴 서로다른인터페이스위에통일된인터페이스또는복잡한인터페이스위에간단한인터페이스를씌움
퍼싸드패턴 문제 : 현재인터페이스가너무복잡하여쉽게사용할수없거나서브시스템을사용하는데너무많은선택이있어 퍼싸드 : 서로다른인터페이스위에통일된인터페이스또는복잡한인터페이스위에간단한인터페이스를제공하는객체 27
퍼싸드사례 28
Compiler 퍼싸드 class Compiler { public: Compiler(); }; virtual void Compile(istream&, BytecodeStream&); void Compiler::Compile ( istream& input, BytecodeStream& output) { Scanner scanner(input); ProgramNodeBuilder builder; Parser parser; parser.parse(scanner, builder); } RISCCodeGenerator generator(output); ProgramNode* parsetree = builder.getrootnode(); parsetree->traverse(generator); 29
LECTURE 11 플라이웨이트패턴
중복되는객체문제 문제 : 중복되는객체는비효율적임 여러객체들이같은상태를가짐 예 : 문서편집기나오류메시지에서사용하는텍스트나스트링구조, 게임에나오는수많은캐릭터들 예 : 디스크에있는같은파일을나타내는파일객체 new File( note.txt ) new File( note.txt ) new File( note.txt ) 그리드에점을나타내는객체 new Point(x, y) new Point(5.23432423, 3.14) 31
플라이웨이트패턴 플라이웨이트 : 어떤클래스의인스턴스도동일한상태를갖지않는다는보장이있어야 객체구축의노력을줄이기위하여객체들의동일한부분을캐쉬로만듦 싱글톤과유사하나많은인스턴스를가지며각객체마다고유한상태를가짐 타입의인스턴스는많으나각인스턴스에유사한부분이많은경우에유용함 32
플라이웨이트의구현 플라이웨이트객체는잘변하지않는객체에적합 의사코드 public class Flyweighted { o static collection (list) of instances o private constructor o static method to get an instance: if (we have created this kind of instance before), get it from the collection and return it else, create a new instance, store it in the collection and return it 33
플라이웨이트순서다이어그램 34
LECTURE 11 반복자패턴
반복자패턴 반복자 : 집합에포함된객체를검사하여반복하는일을할수있도록표준방법을제공하는객체 장점 : 클라이언트자세한표현방법을몰라도됨 접근인터페이스의단순화 36
반복자의구현 class List { public: int size() { } boolean isempty() { } ListElement* get(int index) { } } public class ListIterator { int currentindex; public: boolean hasnext() { } ListElement* first() { } ListElement* next() { } ListElement* current() { } } 37
LECTURE 11 전략패턴 문제를해결하기위하여별도의여러알고리즘을가진객체
전략패턴 전략 (strategy): 알고리즘이알고리즘을사용하는객체에서분리되어캡슐화된객체 각전략이하나의동작 ( 동일한문제를해결한구현 ) 을구현 동작을위한알고리즘과구동하는객체와분리 객체를확장하거나변경하지않고동적으로객체의동작을바꾸고싶을때 39
전략사례 : 카드게임 // Strategy hierarchy parent // (an interface or abstract class) public interface Strategy { public Card getmove(); } // setting a strategy player1.setstrategy(new SmartStrategy()); // using a strategy Card p1move = player1.move(); // uses strategy 모든전략은같은인터페이스로정의되어야 40
디자인패턴의선택 디자인패턴이주어진문제를어떻게해결하고있는지스터디 먼저디자인패턴을잘숙지 주어진상황에제일잘맞는패턴이무엇인지숙고 생성 구조 행위 시스템의변경, 발전, 재사용어느측면이유력한지고려하여적용 각프로젝트에패턴을적용시킬수있는부분을생각해볼것 41