SlideShare una empresa de Scribd logo
1 de 27
Descargar para leer sin conexión
Design Patterns


               Lorna Mitchell
           PHP East Midlands
               3 March 2011
                  rd
Design Patterns
●
    Common language
●
    Familiar problems
●
    NOT rocket science or the holy grail
Some Common Patterns
●
    Singleton
●
    Registry
●
    Factory
●
    Adapter
●
    Decorator
●
    Observer
Singleton
●
    Only one object of this type can exist
●
    Private constructor
●
    Method to return the object
●
    Class manages instantiation
Singleton Example
   1   <?php
   2
   3   class Singleton
   4   {
   5      private static $classInstance;
   6
   7       private function __construct () {}
   8
   9       static function getInstance () {
  10          if (! isset(self::$classInstance)) {
  11             self::$classInstance = new Singleton();
  12          }
  13          return (self::$   classInstance);
  14       }
  15   }
Singleton Is Uncool
●
    Hard to test
●
    Dependency injection is better
●
    Terribly unfashionable
●
    Better than a global variable
Registry
●
    A singleton of singletons
●
    Zend_Registry is an example
●
    Can instantiate, or just store
Registry Example
 1 class Registry
 2 {
 3     private static $storage;
 4
 5     private function __construct () {}
 6
 7     public function set($key, $value) {
 8         self::$storage[$key] = $value;
 9     }
10
11     public function get($key) {
12         if(array_key_exists($key, self::$storage)) {
13              return self::$storage[$key];
14         } else {
15              return false;
16         }
17     }
             19
18 }
             20 Registry::set('shinyThing', new StdClass());
             21 // later ...
             22 $shiny = Registry::get('shinyThing');
Factory
●
    Logic involved in creating an object
●
    Objects usually related
●
    Helpful for testing
Factory Example
  1   class WidgetFactory
  2   {
  3      public function getWiget($type) {
  4        switch($type) {
  5          case 'DatePicker':
  6            // assume simple look/feel, use $options
  7            return new SimpleDatePicker($options);
  8            break;
  9          default:
 10            // do nothing, invalid widget type
 11            break;
 12        }
 13      }
 14   }
 15
 16   $widget_factory = new WidgetFactory();
 17   $picker = $widget_factory->getWidget('DatePicker');
 18   $picker->render();
Combining Patterns
●
    A singleton is also a factory
●
    Can combine factory and registry
Adapter
●
    Making one object look like another
●
    Adapter class presents one interface, and may
    map to another
●
    Target class left unchanged
●
    PDO is a great example
Adapter Example
  1   <?php
  2
  3   class User {
  4       function getUsername() {
  5           return "joe";
  6       }
  7
  8       function getId() {
  9           return 42;
 10       }
 11
 12       function isValid($username, $password) {
 13           return true;
 14       }
 15   }
 16
 17   $user = new User();
 18   if($user->isValid('joe','secret')) {
 19       echo 'Hi ' . $user->getUsername();
 20   }
Adapter Example
  1 <?php
  2
  3 class SuperDuperUser {
  4     function getUser() {
  5         return array ("username" => "joe",
                 "id" => 42);
  6     }
  7
  8     function areCredentialsOK($usr, $pass) {
  9         return true;
 10     }
 11 }
Adapter Example
13   class UserAdapter {
14     function __construct() {
15       $this->_original = new SuperDuperUser();
16     }
18     function getUsername() {
19       $user = $this->_original->getUser();
20       return $user['username'];
21     }
22     function getId() {
23       $user = $this->_original->getUser();
24       return $user['id'];
25     }
27     function isValid($username, $password) {
28       return $this->_original->areCredentialsOK($usr,$pass);
29     }
30   }
31
32   $user = new UserAdapter();
33   if($user->isValid('joe','secret')) {
34       echo 'Hi ' . $user->getUsername();
35   }
Decorator
●
    Unintrusive
●
    Object encloses another object
    ●
        think of pass-the-parcel!
●
    Often literally for visual decoration
Decorator Example
 1   <?php
 2
 3   Interface WeatherInterface {
 4       public function getWeather();
 5   }
 6
 7   class WeatherBot implements WeatherInterface {
 8       public function getWeather() {
 9           // imagine something more complicated
10           return 'Sunny';
11       }
12   }
13
Decorator Example
14   class WordyDecorator implements WeatherInterface
15   {
16     protected $weatherInterface;
18     public function __construct (WeatherInterface $weather) {
19       $this->weatherInterface = $weather;
20     }
22     public function getWeather () {
23       $string = 'Today: '.$this->weatherInterface->getWeather();
24       return ($string);
25     }
26   }
27
28   class BorderDecorator implements WeatherInterface
29   {
30     protected $weatherInterface;
32     public function __construct (WeatherInterface $weather) {
33       $this->weatherInterface = $weather;
34     }
36     public function getWeather () {
37       $string = '~{'.$this->weatherInterface->getWeather().'}~';
38       return ($string);
39     }
40   }
Decorator Example


42 $weather = new WordyDecorator(new WeatherBot);
43 echo $weather->getWeather();
44
Observer
●
    Both subject and object know about the pattern
●
    Observer requests updates
●
    Observee notifies everyone on change
●
    Also called publish/subscribe
Observer Example

                   Target


                      Notify
   Register
   Interest


      Observer
Observer Example
 1 class BankAccount
 2 {
 3    protected $amount;
 4    protected $observer;
 5    public function __construct ($amount) {
 6       $this->observer = new MoneyObserver();
 7       $this->setAmount($amount);
 8    }
 9    protected function setAmount ($amount) {
10       $this->amount = $amount;
11       $this->notify();
12    }
13    public function deposit ($money) {
14       $this->setAmount($this->amount + $money);
15    }
16    public function withdraw ($money) {
17       $this->setAmount($this->amount - $money);
18    }
19    public function notify () {
20       $this->observer->update($this);
21    }
22 }
Observer Example

24 class MoneyObserver
25 {
26    public function update (BankAccount $act) {
27      echo date('H:i:s.u') . ': Balance change: &pound;'
28         . $act->balance() . '<br />';
29    }
30 }
Design Patterns
●
    Singleton
●
    Registry
●
    Factory
●
    Adapter
●
    Decorator
●
    Observer
●
    ... and many more!
Design Patterns
●
    Common vocabulary
●
    NOT a silver bullet
●
    Another tool in the box
●
    Remember: All things in moderation!
Resources
●
    “Gang Of Four” book: Design Patterns:
    Elements of Reusable Object-Oriented
    Software
    ●
        Gamma, Helm, Johnson, Vlissides
●
    Patterns of Enterprise Application Architecture
    ●
        Fowler
●
    http://www.fluffycat.com/PHP-Design-Patterns/
Questions?

Más contenido relacionado

La actualidad más candente

Combatendo code smells em Java
Combatendo code smells em Java Combatendo code smells em Java
Combatendo code smells em Java Emmanuel Neri
 
Working With JQuery Part1
Working With JQuery Part1Working With JQuery Part1
Working With JQuery Part1saydin_soft
 
Doctrine Internals. UnitOfWork
Doctrine Internals. UnitOfWorkDoctrine Internals. UnitOfWork
Doctrine Internals. UnitOfWorkAndrew Yatsenko
 
Introduction to Zend Framework web services
Introduction to Zend Framework web servicesIntroduction to Zend Framework web services
Introduction to Zend Framework web servicesMichelangelo van Dam
 
PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2eugenio pombi
 
C++ prgms 4th unit Inheritance
C++ prgms 4th unit InheritanceC++ prgms 4th unit Inheritance
C++ prgms 4th unit InheritanceAnanda Kumar HN
 
Lexical environment in ecma 262 5
Lexical environment in ecma 262 5Lexical environment in ecma 262 5
Lexical environment in ecma 262 5Kim Hunmin
 
Doctrine with Symfony - SymfonyCon 2019
Doctrine with Symfony - SymfonyCon 2019Doctrine with Symfony - SymfonyCon 2019
Doctrine with Symfony - SymfonyCon 2019julien pauli
 
C++ prgms 5th unit (inheritance ii)
C++ prgms 5th unit (inheritance ii)C++ prgms 5th unit (inheritance ii)
C++ prgms 5th unit (inheritance ii)Ananda Kumar HN
 
Dealing with Legacy PHP Applications
Dealing with Legacy PHP ApplicationsDealing with Legacy PHP Applications
Dealing with Legacy PHP ApplicationsClinton Dreisbach
 
14. CodeIgniter adaugarea inregistrarilor
14. CodeIgniter adaugarea inregistrarilor14. CodeIgniter adaugarea inregistrarilor
14. CodeIgniter adaugarea inregistrarilorRazvan Raducanu, PhD
 
VISUALIZAR REGISTROS EN UN JTABLE
VISUALIZAR REGISTROS EN UN JTABLEVISUALIZAR REGISTROS EN UN JTABLE
VISUALIZAR REGISTROS EN UN JTABLEDarwin Durand
 
droidQuery: The Android port of jQuery
droidQuery: The Android port of jQuerydroidQuery: The Android port of jQuery
droidQuery: The Android port of jQueryPhDBrown
 
Php 5.4: New Language Features You Will Find Useful
Php 5.4: New Language Features You Will Find UsefulPhp 5.4: New Language Features You Will Find Useful
Php 5.4: New Language Features You Will Find UsefulDavid Engel
 
10 tips for a reusable architecture
10 tips for a reusable architecture10 tips for a reusable architecture
10 tips for a reusable architectureJorge Ortiz
 

La actualidad más candente (20)

Combatendo code smells em Java
Combatendo code smells em Java Combatendo code smells em Java
Combatendo code smells em Java
 
Working With JQuery Part1
Working With JQuery Part1Working With JQuery Part1
Working With JQuery Part1
 
Doctrine Internals. UnitOfWork
Doctrine Internals. UnitOfWorkDoctrine Internals. UnitOfWork
Doctrine Internals. UnitOfWork
 
C++ prgms 3rd unit
C++ prgms 3rd unitC++ prgms 3rd unit
C++ prgms 3rd unit
 
Introduction to Zend Framework web services
Introduction to Zend Framework web servicesIntroduction to Zend Framework web services
Introduction to Zend Framework web services
 
PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2
 
C++ prgms 4th unit Inheritance
C++ prgms 4th unit InheritanceC++ prgms 4th unit Inheritance
C++ prgms 4th unit Inheritance
 
Lexical environment in ecma 262 5
Lexical environment in ecma 262 5Lexical environment in ecma 262 5
Lexical environment in ecma 262 5
 
Doctrine with Symfony - SymfonyCon 2019
Doctrine with Symfony - SymfonyCon 2019Doctrine with Symfony - SymfonyCon 2019
Doctrine with Symfony - SymfonyCon 2019
 
C++ prgms 5th unit (inheritance ii)
C++ prgms 5th unit (inheritance ii)C++ prgms 5th unit (inheritance ii)
C++ prgms 5th unit (inheritance ii)
 
Dealing with Legacy PHP Applications
Dealing with Legacy PHP ApplicationsDealing with Legacy PHP Applications
Dealing with Legacy PHP Applications
 
Drupal 8 database api
Drupal 8 database apiDrupal 8 database api
Drupal 8 database api
 
14. CodeIgniter adaugarea inregistrarilor
14. CodeIgniter adaugarea inregistrarilor14. CodeIgniter adaugarea inregistrarilor
14. CodeIgniter adaugarea inregistrarilor
 
VISUALIZAR REGISTROS EN UN JTABLE
VISUALIZAR REGISTROS EN UN JTABLEVISUALIZAR REGISTROS EN UN JTABLE
VISUALIZAR REGISTROS EN UN JTABLE
 
droidQuery: The Android port of jQuery
droidQuery: The Android port of jQuerydroidQuery: The Android port of jQuery
droidQuery: The Android port of jQuery
 
Grails UI Primer
Grails UI PrimerGrails UI Primer
Grails UI Primer
 
ES2015 New Features
ES2015 New FeaturesES2015 New Features
ES2015 New Features
 
Symfony2 your way
Symfony2   your waySymfony2   your way
Symfony2 your way
 
Php 5.4: New Language Features You Will Find Useful
Php 5.4: New Language Features You Will Find UsefulPhp 5.4: New Language Features You Will Find Useful
Php 5.4: New Language Features You Will Find Useful
 
10 tips for a reusable architecture
10 tips for a reusable architecture10 tips for a reusable architecture
10 tips for a reusable architecture
 

Similar a Design Patterns

The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016Kacper Gunia
 
PHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolvePHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolveXSolve
 
The Truth About Lambdas in PHP
The Truth About Lambdas in PHPThe Truth About Lambdas in PHP
The Truth About Lambdas in PHPSharon Levy
 
How Kris Writes Symfony Apps
How Kris Writes Symfony AppsHow Kris Writes Symfony Apps
How Kris Writes Symfony AppsKris Wallsmith
 
Decoupling Objects With Standard Interfaces
Decoupling Objects With Standard InterfacesDecoupling Objects With Standard Interfaces
Decoupling Objects With Standard InterfacesThomas Weinert
 
Migrating to dependency injection
Migrating to dependency injectionMigrating to dependency injection
Migrating to dependency injectionJosh Adell
 
Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...go_oh
 
Melhorando sua API com DSLs
Melhorando sua API com DSLsMelhorando sua API com DSLs
Melhorando sua API com DSLsAugusto Pascutti
 
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSL
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSLPHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSL
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSLiMasters
 
Adding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy ApplicationsAdding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy ApplicationsSam Hennessy
 
What is the difference between a good and a bad repository? (Forum PHP 2018)
What is the difference between a good and a bad repository? (Forum PHP 2018)What is the difference between a good and a bad repository? (Forum PHP 2018)
What is the difference between a good and a bad repository? (Forum PHP 2018)Arnaud Langlade
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICDecoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICKonstantin Kudryashov
 
Into the ZF2 Service Manager
Into the ZF2 Service ManagerInto the ZF2 Service Manager
Into the ZF2 Service ManagerChris Tankersley
 
Desymfony2013.gonzalo123
Desymfony2013.gonzalo123Desymfony2013.gonzalo123
Desymfony2013.gonzalo123Gonzalo Ayuso
 

Similar a Design Patterns (20)

The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016
 
PHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolvePHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolve
 
The Truth About Lambdas in PHP
The Truth About Lambdas in PHPThe Truth About Lambdas in PHP
The Truth About Lambdas in PHP
 
How Kris Writes Symfony Apps
How Kris Writes Symfony AppsHow Kris Writes Symfony Apps
How Kris Writes Symfony Apps
 
Decoupling Objects With Standard Interfaces
Decoupling Objects With Standard InterfacesDecoupling Objects With Standard Interfaces
Decoupling Objects With Standard Interfaces
 
Design patterns in PHP
Design patterns in PHPDesign patterns in PHP
Design patterns in PHP
 
Migrating to dependency injection
Migrating to dependency injectionMigrating to dependency injection
Migrating to dependency injection
 
Unittests für Dummies
Unittests für DummiesUnittests für Dummies
Unittests für Dummies
 
The IoC Hydra
The IoC HydraThe IoC Hydra
The IoC Hydra
 
Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...
 
Melhorando sua API com DSLs
Melhorando sua API com DSLsMelhorando sua API com DSLs
Melhorando sua API com DSLs
 
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSL
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSLPHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSL
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSL
 
Adding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy ApplicationsAdding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy Applications
 
What is DDD and how could it help you
What is DDD and how could it help youWhat is DDD and how could it help you
What is DDD and how could it help you
 
What is the difference between a good and a bad repository? (Forum PHP 2018)
What is the difference between a good and a bad repository? (Forum PHP 2018)What is the difference between a good and a bad repository? (Forum PHP 2018)
What is the difference between a good and a bad repository? (Forum PHP 2018)
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICDecoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DIC
 
PHP pod mikroskopom
PHP pod mikroskopomPHP pod mikroskopom
PHP pod mikroskopom
 
Into the ZF2 Service Manager
Into the ZF2 Service ManagerInto the ZF2 Service Manager
Into the ZF2 Service Manager
 
Effective PHP. Part 1
Effective PHP. Part 1Effective PHP. Part 1
Effective PHP. Part 1
 
Desymfony2013.gonzalo123
Desymfony2013.gonzalo123Desymfony2013.gonzalo123
Desymfony2013.gonzalo123
 

Más de Lorna Mitchell

Web Services PHP Tutorial
Web Services PHP TutorialWeb Services PHP Tutorial
Web Services PHP TutorialLorna Mitchell
 
Best Practice in API Design
Best Practice in API DesignBest Practice in API Design
Best Practice in API DesignLorna Mitchell
 
Git, GitHub and Open Source
Git, GitHub and Open SourceGit, GitHub and Open Source
Git, GitHub and Open SourceLorna Mitchell
 
Business 101 for Developers: Time and Money
Business 101 for Developers: Time and MoneyBusiness 101 for Developers: Time and Money
Business 101 for Developers: Time and MoneyLorna Mitchell
 
Things I wish web graduates knew
Things I wish web graduates knewThings I wish web graduates knew
Things I wish web graduates knewLorna Mitchell
 
Teach a Man To Fish (phpconpl edition)
Teach a Man To Fish (phpconpl edition)Teach a Man To Fish (phpconpl edition)
Teach a Man To Fish (phpconpl edition)Lorna Mitchell
 
Tool Up Your LAMP Stack
Tool Up Your LAMP StackTool Up Your LAMP Stack
Tool Up Your LAMP StackLorna Mitchell
 
Understanding Distributed Source Control
Understanding Distributed Source ControlUnderstanding Distributed Source Control
Understanding Distributed Source ControlLorna Mitchell
 
Best Practice in Web Service Design
Best Practice in Web Service DesignBest Practice in Web Service Design
Best Practice in Web Service DesignLorna Mitchell
 
Coaching Development Teams: Teach A Man To Fish
Coaching Development Teams: Teach A Man To FishCoaching Development Teams: Teach A Man To Fish
Coaching Development Teams: Teach A Man To FishLorna Mitchell
 
Zend Certification Preparation Tutorial
Zend Certification Preparation TutorialZend Certification Preparation Tutorial
Zend Certification Preparation TutorialLorna Mitchell
 
Implementing OAuth with PHP
Implementing OAuth with PHPImplementing OAuth with PHP
Implementing OAuth with PHPLorna Mitchell
 
Object Oriented Programming in PHP
Object Oriented Programming in PHPObject Oriented Programming in PHP
Object Oriented Programming in PHPLorna Mitchell
 
Could You Telecommute?
Could You Telecommute?Could You Telecommute?
Could You Telecommute?Lorna Mitchell
 

Más de Lorna Mitchell (20)

OAuth: Trust Issues
OAuth: Trust IssuesOAuth: Trust Issues
OAuth: Trust Issues
 
Web Services PHP Tutorial
Web Services PHP TutorialWeb Services PHP Tutorial
Web Services PHP Tutorial
 
Best Practice in API Design
Best Practice in API DesignBest Practice in API Design
Best Practice in API Design
 
Git, GitHub and Open Source
Git, GitHub and Open SourceGit, GitHub and Open Source
Git, GitHub and Open Source
 
Business 101 for Developers: Time and Money
Business 101 for Developers: Time and MoneyBusiness 101 for Developers: Time and Money
Business 101 for Developers: Time and Money
 
Things I wish web graduates knew
Things I wish web graduates knewThings I wish web graduates knew
Things I wish web graduates knew
 
Teach a Man To Fish (phpconpl edition)
Teach a Man To Fish (phpconpl edition)Teach a Man To Fish (phpconpl edition)
Teach a Man To Fish (phpconpl edition)
 
Web services tutorial
Web services tutorialWeb services tutorial
Web services tutorial
 
Join In With Joind.In
Join In With Joind.InJoin In With Joind.In
Join In With Joind.In
 
Tool Up Your LAMP Stack
Tool Up Your LAMP StackTool Up Your LAMP Stack
Tool Up Your LAMP Stack
 
Going Freelance
Going FreelanceGoing Freelance
Going Freelance
 
Understanding Distributed Source Control
Understanding Distributed Source ControlUnderstanding Distributed Source Control
Understanding Distributed Source Control
 
Best Practice in Web Service Design
Best Practice in Web Service DesignBest Practice in Web Service Design
Best Practice in Web Service Design
 
Coaching Development Teams: Teach A Man To Fish
Coaching Development Teams: Teach A Man To FishCoaching Development Teams: Teach A Man To Fish
Coaching Development Teams: Teach A Man To Fish
 
Zend Certification Preparation Tutorial
Zend Certification Preparation TutorialZend Certification Preparation Tutorial
Zend Certification Preparation Tutorial
 
Implementing OAuth with PHP
Implementing OAuth with PHPImplementing OAuth with PHP
Implementing OAuth with PHP
 
Web Services Tutorial
Web Services TutorialWeb Services Tutorial
Web Services Tutorial
 
Object Oriented Programming in PHP
Object Oriented Programming in PHPObject Oriented Programming in PHP
Object Oriented Programming in PHP
 
Example Presentation
Example PresentationExample Presentation
Example Presentation
 
Could You Telecommute?
Could You Telecommute?Could You Telecommute?
Could You Telecommute?
 

Último

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 

Último (20)

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 

Design Patterns

  • 1. Design Patterns Lorna Mitchell PHP East Midlands 3 March 2011 rd
  • 2. Design Patterns ● Common language ● Familiar problems ● NOT rocket science or the holy grail
  • 3. Some Common Patterns ● Singleton ● Registry ● Factory ● Adapter ● Decorator ● Observer
  • 4. Singleton ● Only one object of this type can exist ● Private constructor ● Method to return the object ● Class manages instantiation
  • 5. Singleton Example 1 <?php 2 3 class Singleton 4 { 5 private static $classInstance; 6 7 private function __construct () {} 8 9 static function getInstance () { 10 if (! isset(self::$classInstance)) { 11 self::$classInstance = new Singleton(); 12 } 13 return (self::$ classInstance); 14 } 15 }
  • 6. Singleton Is Uncool ● Hard to test ● Dependency injection is better ● Terribly unfashionable ● Better than a global variable
  • 7. Registry ● A singleton of singletons ● Zend_Registry is an example ● Can instantiate, or just store
  • 8. Registry Example 1 class Registry 2 { 3 private static $storage; 4 5 private function __construct () {} 6 7 public function set($key, $value) { 8 self::$storage[$key] = $value; 9 } 10 11 public function get($key) { 12 if(array_key_exists($key, self::$storage)) { 13 return self::$storage[$key]; 14 } else { 15 return false; 16 } 17 } 19 18 } 20 Registry::set('shinyThing', new StdClass()); 21 // later ... 22 $shiny = Registry::get('shinyThing');
  • 9. Factory ● Logic involved in creating an object ● Objects usually related ● Helpful for testing
  • 10. Factory Example 1 class WidgetFactory 2 { 3 public function getWiget($type) { 4 switch($type) { 5 case 'DatePicker': 6 // assume simple look/feel, use $options 7 return new SimpleDatePicker($options); 8 break; 9 default: 10 // do nothing, invalid widget type 11 break; 12 } 13 } 14 } 15 16 $widget_factory = new WidgetFactory(); 17 $picker = $widget_factory->getWidget('DatePicker'); 18 $picker->render();
  • 11. Combining Patterns ● A singleton is also a factory ● Can combine factory and registry
  • 12. Adapter ● Making one object look like another ● Adapter class presents one interface, and may map to another ● Target class left unchanged ● PDO is a great example
  • 13. Adapter Example 1 <?php 2 3 class User { 4 function getUsername() { 5 return "joe"; 6 } 7 8 function getId() { 9 return 42; 10 } 11 12 function isValid($username, $password) { 13 return true; 14 } 15 } 16 17 $user = new User(); 18 if($user->isValid('joe','secret')) { 19 echo 'Hi ' . $user->getUsername(); 20 }
  • 14. Adapter Example 1 <?php 2 3 class SuperDuperUser { 4 function getUser() { 5 return array ("username" => "joe", "id" => 42); 6 } 7 8 function areCredentialsOK($usr, $pass) { 9 return true; 10 } 11 }
  • 15. Adapter Example 13 class UserAdapter { 14 function __construct() { 15 $this->_original = new SuperDuperUser(); 16 } 18 function getUsername() { 19 $user = $this->_original->getUser(); 20 return $user['username']; 21 } 22 function getId() { 23 $user = $this->_original->getUser(); 24 return $user['id']; 25 } 27 function isValid($username, $password) { 28 return $this->_original->areCredentialsOK($usr,$pass); 29 } 30 } 31 32 $user = new UserAdapter(); 33 if($user->isValid('joe','secret')) { 34 echo 'Hi ' . $user->getUsername(); 35 }
  • 16. Decorator ● Unintrusive ● Object encloses another object ● think of pass-the-parcel! ● Often literally for visual decoration
  • 17. Decorator Example 1 <?php 2 3 Interface WeatherInterface { 4 public function getWeather(); 5 } 6 7 class WeatherBot implements WeatherInterface { 8 public function getWeather() { 9 // imagine something more complicated 10 return 'Sunny'; 11 } 12 } 13
  • 18. Decorator Example 14 class WordyDecorator implements WeatherInterface 15 { 16 protected $weatherInterface; 18 public function __construct (WeatherInterface $weather) { 19 $this->weatherInterface = $weather; 20 } 22 public function getWeather () { 23 $string = 'Today: '.$this->weatherInterface->getWeather(); 24 return ($string); 25 } 26 } 27 28 class BorderDecorator implements WeatherInterface 29 { 30 protected $weatherInterface; 32 public function __construct (WeatherInterface $weather) { 33 $this->weatherInterface = $weather; 34 } 36 public function getWeather () { 37 $string = '~{'.$this->weatherInterface->getWeather().'}~'; 38 return ($string); 39 } 40 }
  • 19. Decorator Example 42 $weather = new WordyDecorator(new WeatherBot); 43 echo $weather->getWeather(); 44
  • 20. Observer ● Both subject and object know about the pattern ● Observer requests updates ● Observee notifies everyone on change ● Also called publish/subscribe
  • 21. Observer Example Target Notify Register Interest Observer
  • 22. Observer Example 1 class BankAccount 2 { 3 protected $amount; 4 protected $observer; 5 public function __construct ($amount) { 6 $this->observer = new MoneyObserver(); 7 $this->setAmount($amount); 8 } 9 protected function setAmount ($amount) { 10 $this->amount = $amount; 11 $this->notify(); 12 } 13 public function deposit ($money) { 14 $this->setAmount($this->amount + $money); 15 } 16 public function withdraw ($money) { 17 $this->setAmount($this->amount - $money); 18 } 19 public function notify () { 20 $this->observer->update($this); 21 } 22 }
  • 23. Observer Example 24 class MoneyObserver 25 { 26 public function update (BankAccount $act) { 27 echo date('H:i:s.u') . ': Balance change: &pound;' 28 . $act->balance() . '<br />'; 29 } 30 }
  • 24. Design Patterns ● Singleton ● Registry ● Factory ● Adapter ● Decorator ● Observer ● ... and many more!
  • 25. Design Patterns ● Common vocabulary ● NOT a silver bullet ● Another tool in the box ● Remember: All things in moderation!
  • 26. Resources ● “Gang Of Four” book: Design Patterns: Elements of Reusable Object-Oriented Software ● Gamma, Helm, Johnson, Vlissides ● Patterns of Enterprise Application Architecture ● Fowler ● http://www.fluffycat.com/PHP-Design-Patterns/