Download presentation
Presentation is loading. Please wait.
1
Design Patterns Examples in C++ Moshe Fresko Bar-Ilan University Object Oriented Programming 2006-2007
2
Design Patterns Design Patterns help you learn from others’ successes, instead of your failures Separate things that change, from the things that doesn’t change Elegant and Cheap-to-Maintain Three classes of DPs 1. Creational 2. Behavioral 3. Structural
3
Creational Design Patterns Creational DP: Abstracts the instantiation process. Help make a system independent of how objects are created, composed, represented. Two types 1. Class creational Uses inheritance to vary the class to be instantiated 2. Object creational Delegates instantiation to another object
4
Structural Patterns Structural Patterns are concerned with how classes and objects are composed to form larger structures. Examples: Adapter: Makes an interface to conform to another. So it makes a uniform abstraction of different interfaces. Composite: Describes how to build class hierarchy made up of classes for two kinds of objects: primitive and composite. Decorator: How to add responsibilities to objects dynamically. Proxy Flyweight
5
Behavioral Patterns Behavioral Patterns are concerned with algorithms and the assignment of responsibilities between objects. Not only patterns of objects/classes but also patterns of communication between them. These patterns are: Template Method: An abstract definition of an algorithm. Interpreter: Represents a grammar as a class hierarchy and implements an interpreter as an operation on instances of these classes. Mediator: Provides the indirection needed for loose coupling. Observer: Defines and Maintains dependency between objects. (MVC) Strategy: Encapsulates an algorithm in an Object. Command: Encapsulates a request in an Object. Iterator: Abstracts the way you access and traverse objects in an aggregate.
6
Creational Patterns Creational Patterns are important as systems depend more on object composition Creational Patterns Encapsulate concrete classes system uses Hide how instances of these classes are created
7
Example: To build a Maze
8
Maze example enum Direction { North, South, East, West } ; class MapSite { public: void Enter() = 0 ; } ; class Room: public MapSite { public: Room(int roomNo) ; { roomNumber = number ; } MapSite* GetSide(Direction d) { return sides[d] ; } void SetSide(Direction d, MapSite* m) { sides[d] = m ; } void Enter() { /* … do something … */ } private: MapSite* sides[4] ; int roomNumber ; } ; class Wall: public MapSite { public: Wall() ; virtual void Enter() ; } ; class Door: public MapSite { public: Door(Room*=0, Room*=0) ; virtual void Enter() ; Room* OtherSideFrom(Room*); private: Room* room1 ; Room* room2 ; bool isOpen; } ;
9
Maze Example class Maze { public: Maze() ; void addRoom(Room r) ; Room* RoomNo(int) const; private: // … };
10
Maze Example class MazeGame { public: Maze* CreateMaze() { Maze* maze = new Maze() ; Room* room1 = new Room(1) ; Room* room2 = new Room(2) ; Door* door = new Door(room1,room2) ; maze->AddRoom(room1) ; maze->AddRoom(room2) ; room1->SetSide(North, new Wall()) ; room1->SetSide(East, door) ; room1->SetSide(South, new Wall()) ; room1->SetSide(West, new Wall()) ; room2->SetSide(North, new Wall()) ; room2->SetSide(East, new Wall()) ; room2->SetSide(South, new Wall()) ; room2->SetSide(West, door) ; return maze ; }
11
Factory Method Intent: Define an interface for creating an object, but let subclasses decide which cass to instantiate. Motivation: Example: Framework of Abstract classes Abstract classes: Document, Application Application has Open, New, etc. to create new documents Application cannot know which concrete document to instant Concrete classes: DrawingDocument, DrawingApplication
12
Factory Method Solution CreateDocument() = Factory Method
13
Factory Method Applicability: Use the Factory Method when A class can’t anticipate the class of objects it must create A class wants its subclasses to specify the objects it creates
14
Factory Method
15
Factory Method - Participants Product (Document) The interface of objects the Factory Method creates ConcreteProduct (MyDocument) Implements the product interface Creator (Application) Declares the factory method which returns an object of type Product ConcreteCreator (MyApplication) Defines the Factory method to returnn an instance of ConcreteProduct
16
Factory Method Implementation Abstract Creator Class v.s. Concrete Creator Class Parameterized Factory Method Creator can keep the Class Info to instantiate (Can avoid sub classing) To use naming conventions
17
Factory Methods in Maze Example class MazeGame { public: virtual Maze* MakeMaze() const { return new Maze() ; } virtual Room* MakeRoom(int n) { return new Room(n) ; } virtual Wall* MakeWall() { return new Wall() ; } virtual Door* MakeDoor(Room* r1, Room* r2) { return new Door(r1,r2) ; } Maze* CreateMaze() { Maze* maze = MakeMaze() ; Room* room1 = MakeRoom(1) ; Room* room2 = MakeRoom(2) ; Door* door = MakeDoor(room1,room2) ; ……… return maze ; } } ;
18
Customized Maze Components class BombedWall: public Wall { // … } ; class RoomWithABomb: public Room { public: RoomWithABomb(int n) : Room(n) { } } ; class BombedMazeGame: public MazeGame { public: BombedMazeGame(); virtual Wall* MakeWall() { return new BombedWall() ; } virtual Room* MakeRoom(int n) { return new RoomWithABomb(n) ; } } ;
19
Abstract Factory Intent: Provides an interface for creating families of related or dependent objects without specifying their concrete classes. Motivation: User interface Toolkit supporting multiple look- and- feel standards. (Widgets like Scroll Bars, Windows, Buttons etc.) Not to hard code these widgets for a particular look-and-feel otherwise hard to change it We can define a WidgetFactory interface for creating each basic entity
20
Abstract Factory Example
21
Abstract Factory - Applicability Use Abstract Factory if A system must be independent of how its products are created A system should be configured with one of multiple families of products A family of related objects must be used together You want to reveal only interfaces of a family of products and not their implementations
22
Abstract Factory - Structure
23
Abstract Factory - Participants AbstractFactory (WidgetFactory) Declares an interface of methods to create abstract product objects ConcreteFactory (MotifWidgetFactory,…) Implements the methods to create concrete product objects AbstractProduct (Window, ScrollBar) Declares an interface for a product type ConcreteProduct (MotifWindow, MotifScrollBar) Defines a product object Implements the AbstractProduct interface Client Uses only interfaces declared by AbstractFactory and AbstractProduct
24
Abstract Factory - Implementation Factory better to be a Singleton A new Concrete Factory for each Platform. Or alternatively a single Concrete Factory keeping its Classes of Products. Extending the Factories. (Adding a new Product)
25
Abstract Factory – Maze Example class MazeFactory { public: Maze* MakeMaze() { return new Maze() ; } Room* MakeRoom(int n) { return new Room(n) ; } Wall* MakeWall() { return new Wall() ; } Door* MakeDoor(Room r1, Room r2) { return new Door(r1,r2) ; } } ; class MazeGame { public: Maze* CreateMaze(MazeFactory* factory) { Maze* maze = factory->newMaze() ; Room* room1 = factory->newRoom(1) ; Room* room2 = factory->newRoom(2) ; Door* door = factory->newDoor(room1,room2) ; ……… return maze ; }
26
Customizing Maze Factory class BombedWall: public Wall { // … } ; class RoomWithABomb: public Room { public: RoomWithABomb(int n) : Room(n) { } } ; class BombedMazeFactory: public MazeFactory { public: BombedMazeGame(); virtual Wall* MakeWall() { return new BombedWall() ; } virtual Room* MakeRoom(int n) { return new RoomWithABomb(n) ; } } ;
27
Singleton Intent: Ensure that a class has only one instance, and provide a global point of access to it. Use Singleton There must be exactly one instance of a class, and it must be accessible to clients from a well known access point. When this instance should be extensible by sub- classing
28
Singleton Define an Instance operation to access its unique instance. It must be a static method. Must create its own unique instance.
29
Singleton - benefits Controlled access to sole instance Reduced namespace May be sub-classed to refine operations Can Permit a variable number of instances More flexible than static methods
30
Singleton – Implementation Ensure a unique instance class Singleton { private: static Singleton* inst = 0 ; public: static Singleton* getInstance() { if (inst==0) inst = new Singleton() ; return inst ; } protected Singleton() { } } ; Subclassing the singleton class Put getInstance() method in each subclass
31
Singleton – Maze example class MazeFactory { protected: MazeFactory() { } private: static MazeFactory* inst = null ; public: static MazeFactory* getInst() { if (inst==null) inst = new MazeFactory() ; return inst ; } Maze* makeMaze() { return new Maze() ; } Room* makeRoom(int n) { return new Room(n) ; } Wall* makeWall() { return new Wall() ; } Door* makeDoor(Room r1, Room r2) { return new Door(r1,r2) ; } } ;
32
Singleton – Maze example class MazeGame { public: Maze* createMaze() { Maze maze* = MazeFactory.getInst()->MakeMaze() ; Room room1* = MazeFactory.getInst()->MakeRoom(1) ; Room room2* = MazeFactory.getInst()->MakeRoom(2) ; Door door* = MazeFactory.getInst()->MakeDoor(room1,room2) ; maze->AddRoom(room1) ; maze->AddRoom(room2) ; room1->SetSide(Maze.NORTH,MazeFactory.getInst()-> MakeWall()) ; room1->SetSide(Maze.EAST,door) ; room1->SetSide(Maze.SOUTH,MazeFactory.getInst()-> MakeWall()) ; room1->SetSide(Maze.WEST,MazeFactory.getInst()-> MakeWall()) ; room2->SetSide(Maze.NORTH,MazeFactory.getInst()-> MakeWall()) ; room2->SetSide(Maze.EAST,MazeFactory.getInst()-> MakeWall()) ; room2->SetSide(Maze.SOUTH,MazeFactory.getInst()-> MakeWall()) ; room2->SetSide(Maze.WEST,door) ; return maze ; }
33
Singleton – Alternative Maze Factory class MazeFactory { protected: MazeFactory() { } private: static final string name; private: static MazeFactory* inst = null ; public: static MazeFactory* getInst() { if (inst==null) { if (name=="BOMBED") inst = new BombedMazeFactory() ; else inst = new MazeFactory() ; } return inst ; } // … }
34
Template Singleton Class // in.h template class Singleton : public T { public: static Singleton* GetInstance() { if (! ptrSingObject) ptrSingObject = new Singleton ; return ptrSingObject ; } ~Singleton() { delete ptrSingObject ; } private: Singleton() { } ; static Singleton* ptrSingObject ; }; // In.cpp template Singleton * Singleton ::ptrSingObject = NULL ; // usage class CMyClass { void myfunc() ; } ; // In the program to use Singleton ::GetInstance()->myfunc() ;
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.