Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf ·...

64
Based on slides of: Nurit Gal-oz, Department of Computer Science Ben-Gurion University Mira Balaban Department of Computer Science Ben-Gurion university F. Tip, J. Vlissides, J. Cooper, IBM T J Watson Research Center. R. Whitney, San-Diego State University. D.C. Schmidt, Vanderbilt University. Principles of Object Oriented Programming Spring 2017 Department of Computer Science Ben-Gurion university

Transcript of Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf ·...

Page 1: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Based on slides of: Nurit Gal-oz, Department of Computer Science Ben-Gurion University

Mira Balaban Department of Computer Science Ben-Gurion university

F. Tip, J. Vlissides, J. Cooper, IBM T J Watson Research Center.

R. Whitney, San-Diego State University.

D.C. Schmidt, Vanderbilt University.

Principles of Object Oriented

Programming

Spring 2017

Department of Computer Science Ben-Gurion university

Page 2: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Sources

1. Classical text: Design Patterns: Elements of Reusable Object-Oriented Software, Gamma, Helm, Johnson, Vlissides, (GoF), 1995

2. Java Design Patterns – A Tutorial, J.W. Cooper, 2000. (available online)

3. Applied Java Patterns, S. Stelting, O. Maassen, 2002.

4. Patterns home page: http://hillside.net/patterns/

Page 3: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Gang of Four (GoF)

Page 4: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

What is a Pattern? (R. Whitney)

"Each pattern describes a problem which occurs over and over again in our environment, and then describes the core of the solution to that problem, in such a way that you can use this solution a million times over, without ever doing it the same way twice“

"Each pattern is a three-part rule, which expresses a relation between a certain context, a problem, and a solution"

Christopher Alexander on architecture patterns

A Pattern Language, Christopher Alexander, 1977

Page 5: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Benefits of Software Patterns (R. Whitney)

By providing domain expertise patterns

Reduce time to find solutions

Avoid problems from inexpert design decisions

Patterns reduce time to design applications

Patterns are design chunks larger than objects

Patterns reduce the time needed to understand a design

Page 6: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Inspiration, and a Vocabulary

Design patterns speed the process of finding a

solution, by eliminating the need to reinvent

well-known and proven solutions

Just as important, design patterns provide a

vocabulary with which to discuss the space of

possible design choices

This vocabulary is termed a pattern language

Page 7: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Stages of Design Pattern awareness(J. Vlissides)

Ignorance consternationinitiation

understanding

familiarity

benefit

Page 8: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Software Design Patterns - Motivation

OOD methods emphasize design notations

Fine for specification, documentation

Good OO designers rely on lots of experience

Most powerful reuse is design reuse

Match problem to design experience

Page 9: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Elements of Design Patterns (F. Tip)

A design pattern has 4 elements:

a name (e.g, “Abstract Factory” or “Visitor”)

the problem that the pattern addresses

the solution: the program constructs that are part of the

pattern

the consequences: the results and tradeoffs of applying the

pattern

other factors:

problem & solution have been observed in practice

choice of implementation language important

Page 10: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Basic Pattern Meta-model

Problem Solution

Consequence

Pattern

name

*

Page 11: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Goals Codify good design

distill & generalize experience

aid to novices & experts alike

Give design structures explicit names

common vocabulary

reduced complexity

greater expressiveness

Capture & preserve design information

articulate design decisions succinctly

improve documentation

Facilitate restructuring/refactoring

patterns are interrelated

additional flexibility

Page 12: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Classifying Design Patterns (F. Tip)

purpose: what a pattern does

creational: concerned with creation of objects

structural: related to composition of classes or objects

behavioral: related to interaction and distribution of

responsibility

scope

class-level: concerned with relationship between classes and

their subclasses

object-level: concerned with object relationship (more

dynamic, may be changed at run-time)

Page 13: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

GoF Design Patterns Classified

Machado, B. , Marinho. W. Dsign Patterns

Page 14: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

GoF Design Patterns Classified (F. Tip)

Page 15: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Example

Page 16: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Principles of Object-Oriented Design (F. Tip)

Program to an interface, not an

implementation.

Favor object composition over class

inheritance.

Page 17: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Class vs. Interface Inheritance (F. Tip)

Class inheritance defines an object’s implementation in

terms of another object’s implementation

mechanism for code & representation sharing

Interface inheritance describes when an object can be

used in place of another (subtyping)

many languages (e.g., C++) don’t make this distinction,

but Java does

Page 18: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Class vs. Interface Inheritance (2) (F. Tip)

benefits of class inheritance extend an application’s functionality by reusing functionality

in parent classes

lets you get new implementations almost for free, inheriting most of what you need from existing classes

benefits of interface inheritance clients remain unaware of specific types of objects they use,

and of the classes that implement these objects

using interface inheritance greatly reduces dependencies between subsystems reduces the impact of changes

Page 19: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Mechanisms for Reusing Functionality (F. Tip)

Inheritance versus Composition

class inheritance: define implementation of one class in terms of another often referred to as white-box reuse: internals of parent class

visible to extending class“class inheritance breaks encapsulation”

object composition: compose objects to get new, more complex functionality implemented by giving objects references to other objects;

access these objects via interfaces

requires that objects have well-defined interfaces often called black-box reuse: no internal details of objects are

visible to the class that uses them“composition does not break encapsulation”

Page 20: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Pros & Cons of Class Inheritance (F. Tip)

Advantages: directly supported by the programming language, hence easy to use makes it easy to modify the reused implementation (by simply

overriding a few methods)

Disadvantages: cannot change inherited functionality at run-time, because

inheritance is fixed at compile-time parent classes define at least part of their subclasses’ physical

representation, and subclasses are exposed to details of their parent’s implementation implementation of subclass becomes very tightly coupled with

implementation of parent

change in parent is likely to require changes in subclass

Page 21: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:
Page 22: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Creational Patterns Purpose

deal with object creation mechanisms abstract the process of creating objects make a system unaware of how objects are created, composed, and

represented

What they do encapsulate knowledge about which concrete classes a system uses

(access created objects via interfaces) hide how instances are created

Provide flexibility w.r.t. types of created objects responsibility for creation how and when objects are created

22

Page 23: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Creational Patterns

Abstract Factory

Factory Method

Singleton

Builder

Prototype

23

Page 24: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Maze Game: Example to illustrate

various creational patterns

Simulation of “maze” computer game.

Objectives: find your way out of a maze

solve problems

create map

24

Page 25: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

25

Running Example Building a maze for a computer game.

• A Maze is a set of Rooms.

• A Room knows its neighbors.

– a wall

– a door

Page 26: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Maze Game: Example to illustrate

various creational patterns

a Maze consists of a number of Rooms each Room has 4 sides: North, South, East, West

on each side of a room is a Door or a Wall

abstract superclass MapSite of Room, Door, Wall has method enter()

behavior depends on the kind of subclass

class MazeGame has static method createMaze() for creating a Maze

Room

North

South

East West

26

Page 27: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

An enumerated type: Direction

final class Direction {

private Direction(String n){ _name = n; }

public final static Direction North =

new Direction("North");

public final static Direction South =

new Direction("South");

public final static Direction East =

new Direction("East");

public final static Direction West =

new Direction("West");

public String toString(){ return _name; }

private String _name;

}27

Page 28: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

UML Diagram for Maze Game

28

Page 29: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Classes Maze and MapSite

class Maze {

Maze(){ System.out.println("creating a Maze"); }

void addRoom(Room r){

if (!_rooms.contains(r)){

_rooms.add(r);

}

}

private Set _rooms = new HashSet();

}

class MapSite {

...

}

Maze

Room

*

29

Page 30: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Class Room (1)class Room extends MapSite {

Room(){

_roomNr = _roomCnt++;

System.out.println("creating Room #" + _roomNr);

}

void setSide(Direction d, MapSite site){

if (d == Direction.North){

_northSide = site;

} else if (d == Direction.South){

_southSide = site;

} else if (d == Direction.East){

_eastSide = site;

} else if (d == Direction.West){

_westSide = site;

}

System.out.println("setting " + d.toString() +

" side of " + this.toString() + " to " + site.toString());

}

30

Page 31: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Class Room (2)...

MapSite getSide(Direction d){

MapSite result = null;

if (d == Direction.North){

result = _northSide;

} else if (d == Direction.South){

result = _southSide;

} else if (d == Direction.East){

result = _eastSide;

} else if (d == Direction.West){

result = _westSide;

}

return result;

}

public String toString(){

return "Room #" + new Integer(_roomNr).toString();

}

31

Page 32: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Class Room (3)...

private int _roomNr;

private static int _roomCnt = 1;

private MapSite _northSide;

private MapSite _southSide;

private MapSite _eastSide;

private MapSite _westSide;

}

32

Page 33: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Class Wall

class Wall extends MapSite {

Wall(){

_wallNr = _wallCnt++;

System.out.println("creating Wall #" +

new Integer(_wallNr).toString());

}

public String toString(){ return “Wall #" +

new Integer(_wallNr).toString(); }

private int _wallNr;

private static int _wallCnt = 1;

}

33

Page 34: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Class Doorclass Door extends MapSite {

Door(Room r1, Room r2){

_doorNr = _doorCnt++;

System.out.println("creating a Door #" + _doorNr + " between " + r1 + " and " + r2);

_room1 = r1;

_room2 = r2;

}

public String toString(){

return "Door #" + new Integer(_doorNr).toString();

}

private static int _doorCnt = 1;

private int _doorNr;

private Room _room1;

private Room _room2;

}

34

Page 35: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

class MazeGameclass MazeGame {

public Maze createMaze(){

Maze aMaze = new Maze();

Room r1 = new Room();

Room r2 = new Room();

Door theDoor = new Door(r1,r2);

aMaze.addRoom(r1); aMaze.addRoom(r2);

r1.setSide(Direction.North, new Wall());

r1.setSide(Direction.East, theDoor);

r1.setSide(Direction.South, new Wall());

r1.setSide(Direction.West, new Wall());

r2.setSide(Direction.North, new Wall());

r2.setSide(Direction.East, new Wall());

r2.setSide(Direction.South, new Wall());

r2.setSide(Direction.West, theDoor);

return aMaze;

}

}

35

Page 36: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Driver for creating a Maze

public class Main {

public static void main(String[] args){

MazeGame game = new MazeGame();

game.createMaze();

}

}

36

Page 37: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Outputcreating a Maze

creating Room #1

creating Room #2

creating a Door #1 between Room #1 and Room #2

creating Wall #1

setting North side of Room #1 to Wall #1

setting East side of Room #1 to Door #1

creating Wall #2

setting South side of Room #1 to Wall #2

creating Wall #3

setting West side of Room #1 to Wall #3

creating Wall #4

setting North side of Room #2 to Wall #4

creating Wall #5

setting East side of Room #2 to Wall #5

creating Wall #6

setting South side of Room #2 to Wall #6

setting West side of Room #2 to Door #1

37

Page 38: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Object Diagram

WestEast

38

Page 39: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Observations The code in MazeGame.createMaze() is not very flexible:

the layout of the maze is hard-wired

the types of Rooms, Doors, Walls are hard-coded; there is no mechanism for adding new components such as

DoorNeedingSpell- a door that can be locked and

opened subsequently only with a spell

EnchantedRoom - a room that can have

unconventional items in it, like magic keys or spells

currently, any change to the structure or the components of the maze requires a complete rewrite of class MazeGame

39

Page 40: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Problem and Solution

The problem is inflexibility.

Pattern can make game creation more

flexible... not smaller!

40

Page 41: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Abstract Factory – Motivation

Write a Cross Platform Window Toolkit

A GUI toolkit that supports multiple window management standards – WM1, WM2, ….

A window manager defines a behavior for Widgets – Scroll-bars, Windows, Buttons, …

The GUI interface should handle concrete widgets – buttons, scroll-bars,… of WM1, OR-buttons, scroll-bars, … of WM2,

How to make the GUI interface portable/flexible?

GUI interface should not hard codewidgets!

41

Page 42: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Abstract Factory -- Solution

Insert a Widget Factory between the client – the GUI toolkit

and the concrete widgets -- concrete products

The client obtains a concrete widget by calling the factory

methods.

The client is not aware of the identity of the widgets it holds

(WM1, WM2, …).

42

Page 43: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Abstract Factory -- Solution

Use factory Need widgets

43

Page 44: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Abstract Factory: Participants AbstractFactory

declares interface for operations that create abstract products

ConcreteFactory implements operations to create concrete products

AbstractProduct declares an interface for a type of product object

ConcreteProduct defines the product object created by concrete factory implements the AbstractProduct interface

Client uses only interfaces of AbstractFactory/AbstractProduct

44

Page 45: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Abstract Factory: Class Diagram

public class Client{

public static void main(String args[]){

String input= getInputFromUser();

AbstractFactory pf=getFactory("a"); // AbstractProductA product=pf.createProductA();

//more function calls on product }

}

if(kit.equals("a")){

pf=new ConcreteFactory1();

}

else if(kit.equals("b")){

pf=new ConcreteFactory2();

}

return pf;

45

Page 46: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Abstract Factory – intent and context

provides an interface for creating families of related or dependent objects without specifying their concrete classes

use AbstractFactory when

a system should be independent of how its products are created, composed, represented

a system should be configured with one or multiple families of products

a family of related product objects is designed to be used together and you need to enforce this constraint

you want to provide a class library of products, and you want to reveal just their interfaces, not their implementations

46

Page 47: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

MazeGameclass MazeGame {

public Maze createMaze(MazeFactory factory){

Maze aMaze = factory.makeMaze();

Room r1 = factory.makeRoom();

Room r2 = factory.makeRoom();

Door theDoor = factory.makeDoor(r1,r2);

aMaze.addRoom(r1); aMaze.addRoom(r2);

r1.setSide(Direction.North, factory.makeWall());

r1.setSide(Direction.East, theDoor);

r1.setSide(Direction.South, factory.makeWall());

r1.setSide(Direction.West, factory.makeWall());

r2.setSide(Direction.North, factory.makeWall());

r2.setSide(Direction.East, factory.makeWall());

r2.setSide(Direction.South, factory.makeWall());

r2.setSide(Direction.West, theDoor);

return aMaze;

}

}

class MazeGame {

public Maze createMaze(){

Maze aMaze = new Maze();

Room r1 = new Room();

Room r2 = new Room();

Door theDoor = new Door(r1,r2);

aMaze.addRoom(r1); aMaze.addRoom(r2);

r1.setSide(Direction.North, new Wall());

r1.setSide(Direction.East, theDoor);

r1.setSide(Direction.South, new Wall());

r1.setSide(Direction.West, new Wall());

r2.setSide(Direction.North, new Wall());

r2.setSide(Direction.East, new Wall());

r2.setSide(Direction.South, new Wall());

r2.setSide(Direction.West, theDoor);

return aMaze;

}

}

47

Page 48: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Maze example revisited create a class MazeFactory that creates Mazes, Rooms, Walls, and

Doors

then change class MazeGame to use this factory

class MazeFactory {

public Maze makeMaze(){ return new Maze(); }

public Wall makeWall(){ return new Wall(); }

public Room makeRoom(){ return new Room(); }

public Door makeDoor(Room r1, Room r2){

return new Door(r1,r2);

}

}

48

Page 49: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

MazeGameclass MazeGame {

public Maze createMaze(MazeFactory factory){

Maze aMaze = factory.makeMaze();

Room r1 = factory.makeRoom();

Room r2 = factory.makeRoom();

Door theDoor = factory.makeDoor(r1,r2);

aMaze.addRoom(r1); aMaze.addRoom(r2);

r1.setSide(Direction.North, factory.makeWall());

r1.setSide(Direction.East, theDoor);

r1.setSide(Direction.South, factory.makeWall());

r1.setSide(Direction.West, factory.makeWall());

r2.setSide(Direction.North, factory.makeWall());

r2.setSide(Direction.East, factory.makeWall());

r2.setSide(Direction.South, factory.makeWall());

r2.setSide(Direction.West, theDoor);

return aMaze;

}

}

49

Page 50: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Updated Driverpublic class Main {

public static void main(String[] args){

MazeFactory factory = new MazeFactory();

MazeGame game = new MazeGame();

game.createMaze(factory);

}

}

public class Main {

public static void main(String[] args){

MazeGame game = new MazeGame();

game.createMaze();

}

}

50

Page 51: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Adding new Products is now easyafter adapting MazeGame to use a factory,

it is easy to create mazes with different components:

class EnchantedRoom extends Room {

EnchantedRoom(Spell s){ super(); ... }

public String toString(){

return "enchanted " + super.toString();

}

}

class DoorNeedingSpell extends Door {

DoorNeedingSpell(Room r1, Room r2){ super(r1,r2); .. }

public String toString(){

return super.toString() + " (needing spell)";

}

}

51

Page 52: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

New subclass of MazeFactoryclass EnchantedMazeFactory extends MazeFactory {

public Room makeRoom(){

return new EnchantedRoom(castSpell());

}

public Door makeDoor(Room r1, Room r2){

return new DoorNeedingSpell(r1,r2);

}

protected static Spell castSpell(){

return new Spell();

}

}

52

Page 53: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

New Driver you can now build EnchantedMazes by using an

EnchantedFactory instead of the regular MazeFactory

public class Maze {

public static void main(String[] args){

MazeFactory factory = new EnchantedMazeFactory();

MazeGame game = new MazeGame();

game.createMaze(factory);

}

}

53

Page 54: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

54

Page 55: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

MazeGame example: observations the MazeGame example encodes a somewhat simplified form

of the pattern: MazeFactory is not an abstract class Room, Wall, Door are not abstract either EnchantedMazeFactory only overrides some of the methods in

MazeFactory

in general: downcasting may be needed when you want to access

methods/fields in ConcreteProducts If EnchantedRoom had to access a subclass-specific member of EnchantedWall then it would

have to cast a reference to its walls from Wall to EnchantedWall downcast is required.

useful for situations where you create many instances of the same product, but where you want to be able to vary the product

often used together with the Singleton pattern (concrete factory)

55

Page 56: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Abstract factory: observations Advantages:

Isolates concrete classes. Exchange in product families is easy:

A concrete factory is a singleton – created once in an application. Changing a family of products = changing the factory instance.

Promotes consistency among products.

Disadvantages: Supporting a new kind of products (e.g., new widget) is

difficult – requires extending the interface. Client does not know the kind of product that is produced.

Might require downcaasting.

56

Page 57: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Builder

57

Page 58: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Builder: Motivation A reader for the RTF (Rich Text Format) document

exchange format should be able to convert RTF to many text formats.

The reader might convert RTF documents into plain ASCII text or into a text widget that can be edited interactively.

The problem: The number of possible conversions is open-ended. It should be easy to add a new conversion without modifying the reader.

58

Page 59: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Builder: Solution Configure the RTFReader class with a TextConverter object that

converts RTF to another textual representation. The RTFReader parses the RTF document, When it recognizes an RTF token t

calls aTextConverter on t.

TextConverter responsibilities: perform data conversion. represent the token in a particular format.Create and assemble a complex object.Hide this process.

Subclasses of TextConverter specialize in different conversions and formats.

59

Page 60: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Builder: Solution

60

Page 61: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Builder: Participants Builder

An interface for creating parts of a Product.

ConcreteBuilder Constructs and assembles parts of the product by implementing

the Builder interface. Defines and keeps track of the representation it creates Provides an interface for retrieving the product.

Director Constructs an object using the Builder interface.

Product Represents the complex object under construction. Includes classes that define the constituent parts.

61

Page 62: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Builder: Class Diagram

62

Page 63: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Builder: Sequence Diagram – interaction

with a client:

63

Page 64: Principles of Object Oriented Programmingpoop172/wiki.files/class-6-DP-intro-short.pdf · class-level: concerned with relationship between classes and their subclasses object-level:

Builder: intent and context

Separate the construction of a complex object from its

representation, so that the same construction process can create

different representations.

Use Builder when:

The algorithm for creating a complex object should be

independent of the parts that make up the object and how they

are assembled.

The construction process must allow different representations

for the constructed object.

64