SlideShare a Scribd company logo
1
Design Patterns
Daniel Waligóra
Wrocław 09/01/2012
2
Bibliography
• Martin Fowler,Patterns of Enterprise Appication Architecture
• Matt Zandstra , PHP5 Objects, Patters, and Practice
• http://www.ustream.tv - NewYork PHP channel
• Symfony Live Berlin 2012 - https://joind.in/event/view/1114
• http://scholar.google.pl
• http://pzielinski.com
3
Gang of Four
4
Breakdown Design
Patterns by GoF
Design PatternsDesign Patterns
creationalcreational structuralstructural behavioralbehavioral
- abstract factory
- builder
- prototype
- decorator
- facade
- composite
- observer
- strategy
- command
5
6
7
Implementation related
to the context
programmingprogramming
languagelanguage
scalabilityscalability
modularitymodularity
testabletestable
(integration test)(integration test)
time-consumingtime-consuming size of projectsize of project
8
ContextContext ISIS
related to therelated to the
programmingprogramming
languagelanguage
Design patternsDesign patterns
IS NOTIS NOT relatedrelated
to theto the
programmingprogramming
languagelanguage
9
Transaction Script1. class Hotel  
2. {   
3.     private    
4.         $_gateway;
5.     public function __construct(Data_Access_Gateway $gateway)    
6.     {    
7.         $this->_gateway = $gateway;    
8.     }    
9.   
10.     public function bookRoom($userId, $fromDate, $toDate)    
11.     {    
12.         $roomId = $this->_gateway->_getRoomIdBetweenDates($fromDate, $toDate);    
13.   
14.         if (!$roomId) {    
15.             return false;    
16.         }    
17.   
18.         $days = $this->_getAmountOfDays($fromDate, $toDate);    
19.   
20.         if ($days < = 7) {  
21.             $price = $days * 100;  
22.         } else {   
23.             $price = $days * 80;  
24.         }  
25.           
26.         $data = array(  
27.             'userId' => $userId,    
28.             'roomId' => $roomId,  
29.             'fromDate' => $fromDate,    
30.             'toDate' => $toDate,    
31.             'price' => $price,    
32.         );    
33.   
34.         $bookingId = $this->_gateway->insert('bookings', $data);    
35.   
36.         return $bookingId;    
37.     }    
38. } 
10
Transaction Script
• simple procedural model
• works well with a simple
data access layer
• easy implementation of use
cases
• difficult to maintenance
• code duplication
Disadvantages:Advantages:
11
Table Module #11. class Hotel  
2. {    
3.     public function __construct(Data_Access_Gateway $gateway, Booking $booking)    
•     {    
•         $this->_gateway = $gateway;  
•         $this->_booking = $booking;  
•     }    
•   
•     public function bookRoom($userId, $fromDate, $toDate)    
•     {    
•         $roomId = $this->_booking->getRoomBetweenDates($fromDate, $toDate);  
•   
•         if (!$roomId) {    
•             return false;    
•         }    
•   
•         $days = $this->_getAmountOfDays($fromDate, $toDate);    
•   
•         if ($days < = 7) {  
•             $price = $days * 100;  
•         } else {   
•             $price = $days * 80;  
•         }  
•           
•         $bookingId = $this->_booking-
>addBooking($userId, $roomId, $fromDate, $toDate, $price);    
•   
•         return $bookingId;    
•     }    
• }  
•   
12
Table Module #2
1. class Booking  
2. {    
3.     public function __construct(Data_Access_Gateway $gateway)    
4.     {    
5.         $this->_gateway = $gateway;    
6.     }  
7.       
8.     public function getRoomBetweenDates($dateFrom, $dateTo)  
9.     {  
10.        return $this->_gateway->getRoomBetweenDates($dateFrom, $dateTo);  
11.    }  
12.      
13.    public function addBooking($userId, $roomId, $fromDate, $toDate, $price)    
14.    {    
15.        $data = array(  
16.            'userId' => $userId,    
17.            'roomId' => $roomId,  
18.            'fromDate' => $fromDate,    
19.            'toDate' => $toDate,    
20.            'price' => $price,    
21.        );    
22.  
23.        $bookingId = $this->_gateway->insert('bookings', $data);    
24.  
25.        return $bookingId;    
26.    }    
27.}  
13
Table Module vs
Transaction Script
• less duplication
• encapsulation
• more organized and
structured code
• easy implementation by
technology support
• weak support for
polymorphism
• no support ORM
Disadvantages:Advantages:
14
Domain Model #11. class Hotel  
2. {    
3.     protected $_hotelId;  
4.     protected $_rooms;  
5.       
6.     public function bookRoom(User $user, $fromDate, $toDate)    
7.     {    
8.         $room = $this->_getRoomBetweenDates($fromDate, $toDate);  
9.   
10.         if (is_null($room)) {    
11.             return false;    
12.         }    
13.   
14.         $booking = $room->bookRoom(User $user, $fromDate, $toDate);  
15.   
16.         return $booking;    
17.     }  
18. }  
19.   
20. class Room  
21. {  
22.     protected $_roomId;  
23.     protected $_bookings = array();  
24.       
25.     public function bookRoom(User $user, $fromDate, $toDate)  
26.     {  
27.         $days = $this->_getAmountOfDays($fromDate, $toDate);  
28.           
29.         if ($days < = 7) {  
30.             $booking = new Booking($user, new ShortBookingStrategy($user, $days));  
31.         } else {   
32.             $booking = new Booking($user, new NormalBookingStrategy($user, $days));  
33.         }  
34.           
35.         return $booking;  
36.     }  
37. } 
15
Domain Model #2
1. class NormalBookingPriceStrategy extends BookingPriceStrategy  
2. {  
3.     public function getPrice()  
4.     {  
5.         $price = $this->_days * 80;  
6.           
7.         if ($this->_user->isLoyal()) {  
8.             $price = $price / 2;  
9.         }  
10.          
11.        return $price;  
12.    }  
13.}  
14.  
15.class ShortBookingPriceStrategy extends BookingPriceStrategy  
16.{    
17.    public function getPrice()  
18.    {  
19.        return $this->_days * 100;  
20.    }  
21.}
16
Domain Model vs
Procedural Pattern
• prevents logic duplication
• more code readability
• independence from the data
source
• much easier to unit test
• time-consuming
implementation
• additional patterns
- ORM
- data source
Disadvantages:Advantages:
17
SUMMARY
programmingprogramming
languagelanguage
scalabilityscalability
modularitymodularity
testabletestable
(integration test)(integration test)
time-consumingtime-consuming
size of projectsize of project
skill of the developers
18
Don’t be STUPID,
GRASP SOLID!
19
Sorry, but your code is
STUPID!
20
1.class DB 
2.{  
3.    private static $instance;
4.    public static function getInstance()
5.    {  
6.        if(!isset(self::$instance)) {  
7.            self::$instance = new self;  
8.        }  
9.          
10.        return self::$instance;  
11.    }  
12.}  
•Singleton
21
Dupleton?
21
•Singleton (ctd)
1.class DB 
2. {  
3.     private static $instance;
•     public static function getInstance()
•     {  
•         if(!isset(self::$instance)) {  
•             self::$instance = new self;  
•         }  
•           
•         return self::$instance;  
•     }  
• }  
• class Order 
• {  
•     protected $db;
•     public function __construct()
•     {  
•         $this->db = DB::getInstance();           
•     }  
• }
22
•Singleton (ctd)
1.class DB 
2. {
3.     //body
4. }
5.class Order 
6. {  
•     protected $db;
•     public function __construct(DB $db)
•     {  
•         $this->db = $db;           
•     }  
• }
23
•Tight Coupling
1.Order::buy();
1.class House 
2. {
3.     public function __construct()
•     {
•          $this->door = new Door();
•          $this->window = new Window();
•     }
• }
1.class House 
2. {
3.     public function __construct(Door $door, Window 
$window)
•     {
•          $this->door = $door;
•          $this->window = $window;
•     }
• }
24
•Untestable Code
I donI don’’tt
have ahave a
time!time!
25
Never Make Code
Faster Than Necessary,
Something Important Is
Always Lost When You Do
•Premature Optimization
26
•Premature Optimization (ctd)
PerformancePerformance
problemsproblems
20%20% of codeof code
27
•Indescriptive Naming
char * strpbrk ( const char *, const char * ); 
??
28
•Indescriptive Naming (ctd)
Code is Read Far More Often Than Written
29
DRY (Don’t Repeat Yourself!)
KISS (Keep It Smile, Stupid!)
•Duplication
30
•Singleton
•Tight Coupling
•Untestable Code
•Premature Optimization
•Indescriptive Naming
•Duplication
31
•Single Responsibility Principle
•Open/Closed Principle
•Liskov Substitution Principle
•Interface Segregation Principle
•Dependency Inversion Principle
•Single Responsibility Principle
•Open/Closed Principle
•Liskov Substitution Principle
•Interface Segregation Principle
•Dependency Inversion Principle
32
33
Test Driven-
Development
34
Advantages of Design
Pattern?
• speed up the development process,
• helps to prevent issues that can cause
major problems,
• patterns allow developers to communicate
using well-known, well understood names
for software interactions
35
EoT
ThankYou

More Related Content

PPTX
Why certain code is hard to test?
PPTX
Java annotation
PPTX
Martin folwer
PDF
Knowledge Gathering: Graphic Design + Wayfinding
PDF
Tester du legacy code, mission impossible ?
PPT
Design Patterns
PDF
10 PHP Design Patterns #burningkeyboards
PDF
Learning Php Design Patterns William Sanders
Why certain code is hard to test?
Java annotation
Martin folwer
Knowledge Gathering: Graphic Design + Wayfinding
Tester du legacy code, mission impossible ?
Design Patterns
10 PHP Design Patterns #burningkeyboards
Learning Php Design Patterns William Sanders

Similar to Software Design Patterns (20)

PDF
Your first 5 PHP design patterns - ThatConference 2012
PDF
PHP: 4 Design Patterns to Make Better Code
PDF
Design patterns for fun & profit - CoderCruise 2018
PDF
Switchable Map APIs with Drupal
PDF
Enterprise PHP Architecture through Design Patterns and Modularization (Midwe...
PPT
5 Design Patterns Explained
PPTX
PPT
Design Patterns and Usage
PDF
Design Patterns
PDF
Design patterns revisited with PHP 5.3
PDF
Design patterns illustrated-2015-03
PPTX
Same Patterns Different Architectures - Colombo Architecture Meetup - Session-03
PDF
Design patterns
PPT
Design pattern
PPT
Design_Patterns_Dr.CM.ppt
PPTX
An Introduction to Domain Driven Design in PHP
PDF
Web application architecture
PPTX
Design patterns
PPTX
Same Patterns, Different Architectures
PPTX
Software System Architecture-Lecture 6.pptx
Your first 5 PHP design patterns - ThatConference 2012
PHP: 4 Design Patterns to Make Better Code
Design patterns for fun & profit - CoderCruise 2018
Switchable Map APIs with Drupal
Enterprise PHP Architecture through Design Patterns and Modularization (Midwe...
5 Design Patterns Explained
Design Patterns and Usage
Design Patterns
Design patterns revisited with PHP 5.3
Design patterns illustrated-2015-03
Same Patterns Different Architectures - Colombo Architecture Meetup - Session-03
Design patterns
Design pattern
Design_Patterns_Dr.CM.ppt
An Introduction to Domain Driven Design in PHP
Web application architecture
Design patterns
Same Patterns, Different Architectures
Software System Architecture-Lecture 6.pptx
Ad

Recently uploaded (20)

PPTX
L1 - Introduction to python Backend.pptx
PDF
Complete Guide to Website Development in Malaysia for SMEs
PDF
Salesforce Agentforce AI Implementation.pdf
DOCX
Greta — No-Code AI for Building Full-Stack Web & Mobile Apps
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PDF
AutoCAD Professional Crack 2025 With License Key
PPTX
history of c programming in notes for students .pptx
PPTX
Oracle Fusion HCM Cloud Demo for Beginners
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PPTX
AMADEUS TRAVEL AGENT SOFTWARE | AMADEUS TICKETING SYSTEM
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
Cost to Outsource Software Development in 2025
PDF
Autodesk AutoCAD Crack Free Download 2025
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PPTX
Transform Your Business with a Software ERP System
PPTX
CHAPTER 2 - PM Management and IT Context
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
L1 - Introduction to python Backend.pptx
Complete Guide to Website Development in Malaysia for SMEs
Salesforce Agentforce AI Implementation.pdf
Greta — No-Code AI for Building Full-Stack Web & Mobile Apps
wealthsignaloriginal-com-DS-text-... (1).pdf
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
AutoCAD Professional Crack 2025 With License Key
history of c programming in notes for students .pptx
Oracle Fusion HCM Cloud Demo for Beginners
Design an Analysis of Algorithms I-SECS-1021-03
AMADEUS TRAVEL AGENT SOFTWARE | AMADEUS TICKETING SYSTEM
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Cost to Outsource Software Development in 2025
Autodesk AutoCAD Crack Free Download 2025
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Transform Your Business with a Software ERP System
CHAPTER 2 - PM Management and IT Context
Navsoft: AI-Powered Business Solutions & Custom Software Development
Ad

Software Design Patterns

  • 2. 2 Bibliography • Martin Fowler,Patterns of Enterprise Appication Architecture • Matt Zandstra , PHP5 Objects, Patters, and Practice • http://www.ustream.tv - NewYork PHP channel • Symfony Live Berlin 2012 - https://joind.in/event/view/1114 • http://scholar.google.pl • http://pzielinski.com
  • 4. 4 Breakdown Design Patterns by GoF Design PatternsDesign Patterns creationalcreational structuralstructural behavioralbehavioral - abstract factory - builder - prototype - decorator - facade - composite - observer - strategy - command
  • 5. 5
  • 6. 6
  • 7. 7 Implementation related to the context programmingprogramming languagelanguage scalabilityscalability modularitymodularity testabletestable (integration test)(integration test) time-consumingtime-consuming size of projectsize of project
  • 8. 8 ContextContext ISIS related to therelated to the programmingprogramming languagelanguage Design patternsDesign patterns IS NOTIS NOT relatedrelated to theto the programmingprogramming languagelanguage
  • 9. 9 Transaction Script1. class Hotel   2. {    3.     private     4.         $_gateway; 5.     public function __construct(Data_Access_Gateway $gateway)     6.     {     7.         $this->_gateway = $gateway;     8.     }     9.    10.     public function bookRoom($userId, $fromDate, $toDate)     11.     {     12.         $roomId = $this->_gateway->_getRoomIdBetweenDates($fromDate, $toDate);     13.    14.         if (!$roomId) {     15.             return false;     16.         }     17.    18.         $days = $this->_getAmountOfDays($fromDate, $toDate);     19.    20.         if ($days < = 7) {   21.             $price = $days * 100;   22.         } else {    23.             $price = $days * 80;   24.         }   25.            26.         $data = array(   27.             'userId' => $userId,     28.             'roomId' => $roomId,   29.             'fromDate' => $fromDate,     30.             'toDate' => $toDate,     31.             'price' => $price,     32.         );     33.    34.         $bookingId = $this->_gateway->insert('bookings', $data);     35.    36.         return $bookingId;     37.     }     38. } 
  • 10. 10 Transaction Script • simple procedural model • works well with a simple data access layer • easy implementation of use cases • difficult to maintenance • code duplication Disadvantages:Advantages:
  • 11. 11 Table Module #11. class Hotel   2. {     3.     public function __construct(Data_Access_Gateway $gateway, Booking $booking)     •     {     •         $this->_gateway = $gateway;   •         $this->_booking = $booking;   •     }     •    •     public function bookRoom($userId, $fromDate, $toDate)     •     {     •         $roomId = $this->_booking->getRoomBetweenDates($fromDate, $toDate);   •    •         if (!$roomId) {     •             return false;     •         }     •    •         $days = $this->_getAmountOfDays($fromDate, $toDate);     •    •         if ($days < = 7) {   •             $price = $days * 100;   •         } else {    •             $price = $days * 80;   •         }   •            •         $bookingId = $this->_booking- >addBooking($userId, $roomId, $fromDate, $toDate, $price);     •    •         return $bookingId;     •     }     • }   •   
  • 12. 12 Table Module #2 1. class Booking   2. {     3.     public function __construct(Data_Access_Gateway $gateway)     4.     {     5.         $this->_gateway = $gateway;     6.     }   7.        8.     public function getRoomBetweenDates($dateFrom, $dateTo)   9.     {   10.        return $this->_gateway->getRoomBetweenDates($dateFrom, $dateTo);   11.    }   12.       13.    public function addBooking($userId, $roomId, $fromDate, $toDate, $price)     14.    {     15.        $data = array(   16.            'userId' => $userId,     17.            'roomId' => $roomId,   18.            'fromDate' => $fromDate,     19.            'toDate' => $toDate,     20.            'price' => $price,     21.        );     22.   23.        $bookingId = $this->_gateway->insert('bookings', $data);     24.   25.        return $bookingId;     26.    }     27.}  
  • 13. 13 Table Module vs Transaction Script • less duplication • encapsulation • more organized and structured code • easy implementation by technology support • weak support for polymorphism • no support ORM Disadvantages:Advantages:
  • 14. 14 Domain Model #11. class Hotel   2. {     3.     protected $_hotelId;   4.     protected $_rooms;   5.        6.     public function bookRoom(User $user, $fromDate, $toDate)     7.     {     8.         $room = $this->_getRoomBetweenDates($fromDate, $toDate);   9.    10.         if (is_null($room)) {     11.             return false;     12.         }     13.    14.         $booking = $room->bookRoom(User $user, $fromDate, $toDate);   15.    16.         return $booking;     17.     }   18. }   19.    20. class Room   21. {   22.     protected $_roomId;   23.     protected $_bookings = array();   24.        25.     public function bookRoom(User $user, $fromDate, $toDate)   26.     {   27.         $days = $this->_getAmountOfDays($fromDate, $toDate);   28.            29.         if ($days < = 7) {   30.             $booking = new Booking($user, new ShortBookingStrategy($user, $days));   31.         } else {    32.             $booking = new Booking($user, new NormalBookingStrategy($user, $days));   33.         }   34.            35.         return $booking;   36.     }   37. } 
  • 15. 15 Domain Model #2 1. class NormalBookingPriceStrategy extends BookingPriceStrategy   2. {   3.     public function getPrice()   4.     {   5.         $price = $this->_days * 80;   6.            7.         if ($this->_user->isLoyal()) {   8.             $price = $price / 2;   9.         }   10.           11.        return $price;   12.    }   13.}   14.   15.class ShortBookingPriceStrategy extends BookingPriceStrategy   16.{     17.    public function getPrice()   18.    {   19.        return $this->_days * 100;   20.    }   21.}
  • 16. 16 Domain Model vs Procedural Pattern • prevents logic duplication • more code readability • independence from the data source • much easier to unit test • time-consuming implementation • additional patterns - ORM - data source Disadvantages:Advantages:
  • 19. 19 Sorry, but your code is STUPID!
  • 20. 20 1.class DB  2.{   3.    private static $instance; 4.    public static function getInstance() 5.    {   6.        if(!isset(self::$instance)) {   7.            self::$instance = new self;   8.        }   9.           10.        return self::$instance;   11.    }   12.}   •Singleton 21 Dupleton?
  • 21. 21 •Singleton (ctd) 1.class DB  2. {   3.     private static $instance; •     public static function getInstance() •     {   •         if(!isset(self::$instance)) {   •             self::$instance = new self;   •         }   •            •         return self::$instance;   •     }   • }   • class Order  • {   •     protected $db; •     public function __construct() •     {   •         $this->db = DB::getInstance();            •     }   • }
  • 22. 22 •Singleton (ctd) 1.class DB  2. { 3.     //body 4. } 5.class Order  6. {   •     protected $db; •     public function __construct(DB $db) •     {   •         $this->db = $db;            •     }   • }
  • 23. 23 •Tight Coupling 1.Order::buy(); 1.class House  2. { 3.     public function __construct() •     { •          $this->door = new Door(); •          $this->window = new Window(); •     } • } 1.class House  2. { 3.     public function __construct(Door $door, Window  $window) •     { •          $this->door = $door; •          $this->window = $window; •     } • }
  • 24. 24 •Untestable Code I donI don’’tt have ahave a time!time!
  • 25. 25 Never Make Code Faster Than Necessary, Something Important Is Always Lost When You Do •Premature Optimization
  • 28. 28 •Indescriptive Naming (ctd) Code is Read Far More Often Than Written
  • 29. 29 DRY (Don’t Repeat Yourself!) KISS (Keep It Smile, Stupid!) •Duplication
  • 30. 30 •Singleton •Tight Coupling •Untestable Code •Premature Optimization •Indescriptive Naming •Duplication
  • 31. 31 •Single Responsibility Principle •Open/Closed Principle •Liskov Substitution Principle •Interface Segregation Principle •Dependency Inversion Principle •Single Responsibility Principle •Open/Closed Principle •Liskov Substitution Principle •Interface Segregation Principle •Dependency Inversion Principle
  • 32. 32
  • 34. 34 Advantages of Design Pattern? • speed up the development process, • helps to prevent issues that can cause major problems, • patterns allow developers to communicate using well-known, well understood names for software interactions