02 - Creational Design Patterns Moshe Fresko Bar-Ilan University תשס"ח 2008.

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.
T O K ILL A S INGLETON F ACTORY M ETHOD P ATTERN Josh Mason 6/18/09.
Plab – Tirgul 12 Design Patterns
Nov, 1, Design Patterns PROBLEM CONTEXT SOLUTION A design pattern documents a proven solution to a recurring problem in a specific context and its.
OOMPA Lecture 10 Design Patterns Singleton Factory Method
Prototype Pattern Intent:
Design Patterns Based on Design Patterns. Elements of Reusable Object-Oriented Software. by E.Gamma, R. Helm, R. Johnson,J. Vlissides.
1 Creational Patterns CS : Software Design Winter /T8.
Design Patterns Examples in C++ Moshe Fresko Bar-Ilan University Object Oriented Programming
Creational Patterns: The Abstract Factory CSE 335 Spring 2008 E. Kraemer.
Prototype Creational Design Pattern By Brian Cavanaugh September 22, 2003 Software, Design and Documentation.
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.
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.
Software Components Creational Patterns.
Abstract Factory Abstract Factory using Factory Method.
12/6/20041 The Factory Method Pattern Presenters 王世賀 F 陳祐毓 F 張峻銘 F 吳佩達 F 林俊成 F 鄭榮智 F 許書豪 F
The Factory Patterns SE-2811 Dr. Mark L. Hornick 1.
Creational Patterns CSE Creational Patterns Class creational pattern ◦ uses inheritance to vary the class that is instantiated Object creational.
Factory Method Chris Colasuonno Also known as “Virtual Constructor”
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 Sanjeeb Kumar Nanda 30-Aug What is a pattern? Pattern is a recurring solution to a standard problem Each Pattern describes a problem.
Prototype pattern Participants Prototype (Graphic) – declared an interface for cloning itself ConcretePrototype (EditBox, Slider) – implements an operation.
CS 590L – Distributed Component Architecture 02/20/2003Uttara Paingankar1 Design Patterns: Factory Method The factory method defines an interface for creating.
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.
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.
 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.
Overview of Creational Patterns ©SoftMoore ConsultingSlide 1.
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.
07 - Creational PatternsCSC4071 Creational Patterns Patterns used to abstract the process of instantiating objects. –class-scoped patterns uses inheritance.
1 DesignPattern-3 Creational Patterns Suntae Kim Kangwon National University
Design Pattern.
Design Patterns: MORE Examples
Abstract Factory Pattern
Factory Method Pattern
Design Pattern Catalogues
Factory Patterns 1.
Software Design and Architecture
Factory Method Pattern
Abstract Factory Pattern
Intent (Thanks to Jim Fawcett for the slides)
Design Patterns - A few examples
Software Engineering Lecture 7 - Design Patterns
CSE 432 Presentation GoF: Factory Method PH: “To Kill a Singleton”
Ms Munawar Khatoon IV Year I Sem Computer Science Engineering
Lesson 5: More on Creational Patterns
Creational Patterns.
Software Design Lecture 9.
Presentation transcript:

02 - Creational Design Patterns Moshe Fresko Bar-Ilan University תשס"ח 2008

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 of Creational Patterns 1. Class creational patterns Use inheritance to vary the class that is instantiated 2. Object creational patterns Delegates instantiation to another object

Creational Design Patterns Two recurring themes in these patterns 1. They encapsulate knowledge about which concrete classes the system use. 2. They hide how instances of these classes are created and put together. The system only knows the interfaces. Creational DP-s let you configure the system with “product” objects Configuration can be static (compile-time) or dynamic (run-time).

Example: To build a Maze

Maze Example – MapSite Abstract class enum Direction { North, South, East, West } ; class MapSite { public: void Enter() = 0 ; } ;

Maze Example – Room class Room: public MapSite { public: Room(int roomNo) ; { roomNumber = number ; } MapSite* GetSide(Direction d) const { return sides[d] ; } void SetSide(Direction d, MapSite* m) { sides[d] = m ; } virtual void Enter() { /* … do something … */ } private: MapSite* sides[4] ; int roomNumber ; } ;

Maze Example – Wall and Door 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 – Collection of Rooms class Maze { public: Maze() ; void addRoom(Room r) ; Room* RoomNo(int) const; private: // … };

Maze Example – Creation of Maze 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 ; } Room 1Room 2

Creational Patterns Factory Method Create-Maze calls virtual functions to create components Abstract Factory Create-Maze is passed an object to use to create components Prototype Create-Maze is parameterized by various prototypes Builder Create-Maze is passed an object that can create entire Maze Singleton Can ensure that there is only one maze per game.

Factory Method Moshe Fresko Bar-Ilan University תשס"ו Design Patterns Course

Factory Method Intent: Define an interface for creating an object, but let subclasses decide which class 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 instantiate Concrete classes: DrawingDocument, DrawingApplication Factory Method encapsulates the knowledge of which Document subclass to create and move this knowledge out of the framework.

Factory Method – Motivation CreateDocument() is called Factory Method

Factory Method – 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 ; } } ;

Factory Method – Maze, Customized 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) ; } } ;

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 Classes delegate responsibility to one of several helper subclasses and you want to localize the knowledge of which helper subclass is the delegate

Factory Method – Structure

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 – Consequences Eliminates the need to bind application- specific classes into the code. Disadvantage: Clients might have to subclass the Creator class just to create a particular ConcreteProduct. Provides hooks for subclasses to create extended version of an object. Connects parallel class hierarchies.

Factory Method – Implementation Issues 1. Two Major Varieties Creator class has abstract factory methods Creator class defines default behavior for factory methods 2. Parameterized Factory Methods One factory method can create multiple kinds of products. All objects must have the same interface. Factory method can take a class ID. 3. Language-specific issues. Creator can keep the Class information for creating new instances, dropping the need for the sub-classing. 4. Templates can be used to avoid subclassing.

Abstract Factory Moshe Fresko Bar-Ilan University תשס"ו Design Patterns Course

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 Widget Factory enforces dependencies between the concrete Widget classes

Abstract Factory Example

Factory Method – 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 ; } } ;

Factory Method – Maze Example 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) ; } } ;

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 – Consequences 1. It isolates concrete classes 2. It makes exchanging product families easy 3. It promotes consistency among products 4. Supporting new kinds of products is difficult

Abstract Factory – Implementation Factory better to be a Singleton If many product families are possible, the Concrete Factory can be implemented using Prototype. Or alternatively the Class information of products can be kept (for languages supporting Class information). Defining Extensible Factories: Adding a new Product type means to change AbstractFactory and all its subclasses. A more flexible but less safe design is to add a parameter to operations that create objects.

Singleton Moshe Fresko Bar-Ilan University תשס"ו Design Patterns Course

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 1. Controlled access to sole instance 2. Reduced namespace 3. May be sub-classed to refine operations 4. Can Permit a variable number of instances 5. More flexible than static methods

Singleton – Implementation Ensure a unique instance class Singleton { private: static Singleton* inst = 0 ; protected: Singleton() { } public: static Singleton* getInstance() { if (inst==0) inst = new Singleton() ; return inst ; } } ; Subclassing the singleton class How to install the unique instance? To determine it in getInstance() method To rewrite getInstance() in the subclass To keep registry of Singletons

Singleton – Maze Factory 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) ; ……… return maze ; }

Singleton – Alternative Maze Factory MazeFactory* MazeFactory::getInst() { if (inst==0) { const char* style = getenv("MAZESTYLE") ; if (strcmp(style,"BOMBED“)) inst = new BombedMazeFactory() ; else if (strcmp(style,"BOMBED“)) inst = new EnchantedMazeFactory() ; 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() ;