Professional Documents
Culture Documents
DESIGN PATTERN
[ Creational Patterns ]
R.CHINNAA
ASST.PROFESSOR/CSE
GCE-SRIRANGAM
Introduction
Definition:
Problems and solutions are broadly applicable, used by many people over
many years
Describe various things such as algorithm for the problem, the class or
the object structure of the problem or it can list down the conditions that
must be followed before applying the pattern.
Solution:
UML-like structure, abstract code
Consequences:
describe the results and tradeoffs
Structural patterns:
Composition of classes or objects
Behavioral patterns:
Deal with dynamic interactions among societies of objects
Factory Method: Define an interface for creating an object, but let subclasses
decide which class to instantiate.
Also Known As :
Virtual Constructor
Motivation:
• Frameworks use abstract classes to define and maintain relationships
between objects. A framework is often responsible for creating these objects
as well.
• Example
• Two key abstractions in the framework: Application and Document abstract classes.
• A concrete application to be developed from the framework subclasses the framework
classes to realize its application-specific implementations.
• Application class can't predict the subclass of Document to instantiate.
• Application class only knows when a new document should be created, not what kind of
Document to create.
• Dilemma: The framework must instantiate classes, but it only knows about abstract
classes, which it cannot instantiate.
• The Factory Method pattern solution:
• Encapsulates the knowledge of which Document subclass to create and moves this knowledge
out of the framework.
9
FACTORY METHOD
Motivation
docs
Document Application
Open()
CreateDocument() Document* doc=CreateDocument();
Close()
NewDocument() docs.Add(doc);
Save() doc->Open();
OpenDocument()
Revert()
MyApplication
MyDocument
return new MyDocument
CreateDocument()
10
Applicability
Use the Factory Method pattern when
a class can´t anticipate the class of objects it must create.
Creator
+FactoryMethod() ...
+AnOperation() product=FactoryMethod()
Product ...
ConcreteCreator
ConcreteProduct return new ConcreteProduct
+FactoryMethod()
Participants
Product
ConcreteProduct
Creator
Declares the factory method and may provide a default implementation for it.
Defines the return type as Product.
ConcreteCreator
Related Patterns
• Abstract Factory
• Template Methods
• Prototypes
Factory Method
Benefits:
Flexible and loose coupling
Consistency
Demerits
Refactored
Re-implementation
Complex
Structural patterns
Structural patterns are concerned with how classes and objects are composed to
form larger structures.
As a simple example, consider how multiple inheritance mixes two or more classes
into one. The result is a class that combines the properties of its parent classes.
This pattern is particularly useful for making independently developed class libraries
work together.
Two drawbacks
– It’s inconvenient to extend the Window abstraction to cover different kinds of windows or new
platforms.
Imagine an IconWindow subclass of Window that specializes the Window abstraction for icons. To support
IconWindows for both platforms, we have to implement two new classes, XIconWindow and PMIconWindow.
Worse,
we'll have to define two classes for every kind of window. Supporting a third platform requires yet another
new Window subclass for every kind of window.
– It makes client code platform dependent .
Whenever a client creates a window, it instantiates a concrete class that has a specific
implementation.
For example, creating an XWindow object binds the Window abstraction to the X Window
implementation, which makes the client code dependent on the X Window implementation. This, in
turn, makes it harder to port the client code to other platforms.
One class hierarchy for window interfaces and a separate hierarchy for
platform specific window implementation with WindowImp as its root.
When the implementation should be completely hidden from the client. (C++)
bridge
Participants
Abstraction (Window)
defines the abstraction interface
Implementor (WindowImp)
defines the interface for the implementation classes.
ConcreteImplementor (XWindowImp)
implements the implementor interface and defines its concrete implementation.
Collaborations
Abstraction forwards client requests to its implementor object
Consequences
Decoupling interface and implementation
An implementation is not bound permanently to an interface. The implementation of
an abstraction can be configured at run-time. It's even possible for an object to
change its implementation at run-time.
Improved extensibility
Abstraction and Implementor hierarchies can be extended independently
The Adapter pattern is geared toward making unrelated classes work together.
It is usually applied to systems after they’re designed. Bridge, on the other
hand, is used up-front in a design to let abstractions and implementations vary
independently.
Known Uses
ET++
libg++
NeXT's AppKit
Benefits
Improved extensibility.
Adapter Intent
Also Known As
-> Wrapper
Motivation
Sometimes a toolkit class that's designed for reuse isn't reusable only
because its interface doesn't match the domain-specific interface an
application requires.
Consider for example a drawing editor that lets users draw and arrange
graphical elements (lines, polygons, text, etc.) into pictures and diagrams.
The drawing editor's key abstraction is the graphical object, which has an
editable shape and can draw itself.
The interface for graphical objects is defined by an abstract class called
Shape. The editor defines a subclass of Shape for each kind of graphical
object: a LineShape class for lines, a PolygonShape class for polygons, and
so forth.
Motivation
Classes for elementary geometric shapes like LineShape and PolygonShape are
rather easy to implement, because their drawing and editing capabilities are
inherently limited. But a TextShape subclass that can display and edit text is
considerably more difficult to implement, since even basic text editing involves
complicated screen update and buffer management.
Ideally we'd like to reuse TextView to implement TextShape, but the toolkit wasn't
designed with Shape classes in mind. So we can't use TextView and Shape objects
interchangeably.
we could define TextShape so that it adapts the TextView interface to Shape's. We
can do this in one of two ways:
(1) by inheriting Shape's interface and TextView's implementation
or (2) by composing a TextView instance within a TextShape and implementing TextShape in terms
of TextView's interface.
These two approaches correspond to the class and object versions of the Adapter
pattern. We call TextShape an adapter.
Motivation
Example:
Motivation
TextShape adapts TextView to the Shape interface, the drawing editor can
reuse the otherwise incompatible TextView class.
Applicability
Use the Adapter pattern when
You want to use an existing class, and its interface does not match the one
you need
You want to create a reusable class that cooperates with unrelated classes
with incompatible interfaces.
(object adapter only) you need to use several existing subclasses, but it's
impractical to adapt their interface by subclassing every one. An object
adapter can adapt the interface of its parent class.
Structure
A class adapter uses multiple inheritance to adapt one
interface to another:
Structure
An object adapter relies on object composition:
Participants
Target (shape)
Adapter (TextShape)
Adaptee (TextView)
Client (DrawingEditor)
The first step, which is common to all three of the implementations discussed here,
is to find a ``narrow'' interface for Adaptee, that is, the smallest subset of operations
that lets us do the adaptation.
Given this narrow interface, here are three possible implementation approaches:
Implementation
1. Using abstract operations.
Define corresponding abstract operations for the
narrow Adaptee interface in the TreeDisplay class.
Subclasses must implement the abstract
operations and adapt the hierarchically structured
object.
In our example, this means TreeDisplay stores one block for converting a
node into a GraphicNode and another block for accessing a node's
children.
Known Uses
ET++Draw
InterViews 2.6
Pluggable adapters are common in ObjectWorks\Smalltalk
NeXT's AppKit
Meyer's "Marriage of Convenience"
Related Patterns
Bridge
It has a structure similar to an object adapter, but Bridge has a different intent: It is
meant to separate an interface from its implementation so that they can be varied
easily and independently. An adapter is meant to change the interface of
an existing object.
Decorator
enhances another object without changing its interface. A decorator is thus more
transparent to the application than an adapter is. As a consequence, Decorator
supports recursive composition, which isn’t possible with pure adapters.
Proxy
defines a representative or surrogate for another object and does not change its
interface.
Code: