Design Patterns Examples in C++ Moshe Fresko Bar-Ilan University Object Oriented Programming 2006-2007.

Slides:



Advertisements
Similar presentations
Creational Design Patterns. Creational DP: Abstracts the instantiation process Helps make a system independent of how objects are created, composed, represented.
Advertisements

Creational Patterns (2) CS350/SE310 Fall, Lower the Cost of Maintenance Economic Goal Coupling-Cohesion, Open-Close, Information-Hiding, Dependency.
Creational Patterns, Abstract Factory, Builder Billy Bennett June 11, 2009.
Copyright © Active Frameworks Inc. - All Rights Reserved - V2.0Creational Patterns - Page L4-1 PS95&96-MEF-L11-1 Dr. M.E. Fayad Creationa l Paradigm.
Plab – Tirgul 12 Design Patterns
. Plab – Tirgul 12 Design Patterns. Design Patterns u The De-Facto Book on Design Patterns:
OOMPA Lecture 10 Design Patterns Singleton Factory Method
Prototype Pattern Intent:
Oct, 16, Design Patterns PROBLEM CONTEXT SOLUTION A design pattern documents a proven solution to a recurring problem in a specific context and.
DESIGN PATTERNS Redesigning Applications And
Design Patterns Based on Design Patterns. Elements of Reusable Object-Oriented Software. by E.Gamma, R. Helm, R. Johnson,J. Vlissides.
Algorithm Programming Behavioral Design Patterns Bar-Ilan University תשס " ו by Moshe Fresko.
1 Creational Patterns CS : Software Design Winter /T8.
Design Patterns Module Name - Object Oriented Modeling By Archana Munnangi S R Kumar Utkarsh Batwal ( ) ( ) ( )
Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Abstract Factory Pattern.
Creational Patterns Making Objects The Smart Way Brent Ramerth Abstract Factory, Builder.
Design Patterns CS 124 Reference: Gamma et al (“Gang-of-4”), Design Patterns.
Singleton Christopher Chiaverini Software Design & Documentation September 18, 2003.
Design Patterns.
ECE450 - Software Engineering II1 ECE450 – Software Engineering II Today: Design Patterns II.
1 GoF Template Method (pp ) GoF Strategy (pp ) PH Single User Protection (pp ) Presentation by Julie Betlach 6/08/2009.
Creational Patterns (1) CS350, SE310, Fall, 2010.
An Introduction to Design Patterns. Introduction Promote reuse. Use the experiences of software developers. A shared library/lingo used by developers.
02 - Creational Design Patterns Moshe Fresko Bar-Ilan University תשס"ח 2008.
Software Components Creational Patterns.
Computing IV Singleton Pattern Xinwen Fu.
GoF: Document Editor Example Rebecca Miller-Webster.
Design Patterns CS 124 Reference: Gamma et al (“Gang-of-4”), Design Patterns.
Creational Patterns CSE Creational Patterns Class creational pattern ◦ uses inheritance to vary the class that is instantiated Object creational.
Design Patterns CSIS 3701: Advanced Object Oriented Programming.
Define an interface for creating an object, but let subclasses decide which class to instantiate Factory Method Pattern.
The Factory Method Design Pattern Motivation: Class / Type separation – Abstract class serves as type definition and concrete class provides implementation.
Abstract Factory and Factory Method CS 124 Reference: Gamma et al (“Gang-of-4”), Design Patterns.
CDP-1 9. Creational Pattern. CDP-2 Creational Patterns Abstracts instantiation process Makes system independent of how its objects are –created –composed.
OO Methodology Elaboration Iteration 2 - Design Patterns -
Factory Method Explained. Intent  Define an interface for creating an object, but let subclasses decide which class to instantiate.  Factory Method.
Define an interface for creating an object, but let subclasses decide which class to instantiate.
Design Patterns Yonglei Tao. Design Patterns  A design pattern describes a recurring design problem, a solution, and the context in which that solution.
DESIGN PATTERNS Sanjeeb Kumar Nanda 30-Aug What is a pattern? Pattern is a recurring solution to a standard problem Each Pattern describes a problem.
FACTORY METHOD. Design Pattern Space Purpose ScopeCreationalStructuralBehavioral ClassFactory MethodAdapterInterpreter Template Method ObjectAbstract.
Design Pattern. Definition: A design pattern is a general reusable solution to a commonly occurring problem within a given context in software design.
Design Patterns Introduction
ECE450 - Software Engineering II1 ECE450 – Software Engineering II Today: Design Patterns I.
The Factory Method Pattern (Creational) ©SoftMoore ConsultingSlide 1.
Advanced Object-oriented Design Patterns Creational Design Patterns.
Example to motivate discussion We have two lists (of menu items) one implemented using ArrayList and another using Arrays. How does one work with these.
CS 210 Proxy Pattern Nov 16 th, RMI – A quick review A simple, easy to understand tutorial is located here:
 Creational design patterns abstract the instantiation process.  make a system independent of how its objects are created, composed, and represented.
Singleton Pattern. Problem Want to ensure a single instance of a class, shared by all uses throughout a program Context Need to address initialization.
Five Minute Design Patterns Doug Marttila Forest and the Trees May 30, 2009 Template Factory Singleton Iterator Adapter Façade Observer Command Strategy.
The Abstract Factory Pattern (Creational) ©SoftMoore ConsultingSlide 1.
S.Ducasse Stéphane Ducasse 1 Abstract Factory.
Design Patterns Creational Patterns. Abstract the instantiation process Help make the system independent of how its objects are created, composed and.
Abstract Factory pattern Intent Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
SOFTWARE DESIGN Design Patterns 1 6/14/2016Computer Science Department, TUC-N.
CLASSIFICATION OF DESIGN PATTERNS Hladchuk Maksym.
07 - Creational PatternsCSC4071 Creational Patterns Patterns used to abstract the process of instantiating objects. –class-scoped patterns uses inheritance.
Design Pattern.
Design Patterns: MORE Examples
Design Patterns: Brief Examples
Chapter 10 Design Patterns.
MPCS – Advanced java Programming
Factory Patterns 1.
Design Patterns with C# (and Food!)
object oriented Principles of software design
Software Engineering Lecture 7 - Design Patterns
Ms Munawar Khatoon IV Year I Sem Computer Science Engineering
Creational Patterns.
Informatics 122 Software Design II
Software Design Lecture 9.
Presentation transcript:

Design Patterns Examples in C++ Moshe Fresko Bar-Ilan University Object Oriented Programming

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

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

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

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.

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

Example: To build a Maze

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; } ;

Maze Example class Maze { public: Maze() ; void addRoom(Room r) ; Room* RoomNo(int) const; private: // … };

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 ; }

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

Factory Method Solution CreateDocument() = Factory Method

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

Factory Method

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

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

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 ; } } ;

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) ; } } ;

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

Abstract Factory Example

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

Abstract Factory - Structure

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

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)

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 ; }

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) ; } } ;

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

Singleton Define an Instance operation to access its unique instance. It must be a static method. Must create its own unique instance.

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

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

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) ; } } ;

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 ; }

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 ; } // … }

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() ;