Skip to content

Commit

Permalink
Added Design Patterns page.
Browse files Browse the repository at this point in the history
  • Loading branch information
stevenbenner committed Jul 20, 2012
1 parent a4e0494 commit 2cb5960
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 2 deletions.
3 changes: 1 addition & 2 deletions _posts/05-03-01-Design-Patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,4 @@ lot of the pattern decisions are made for you. But it is still up to you to pick
code you build on top of the framework. If, on the other hand, you are not using a framework to build your application
then you have to find the patterns that best suit the type and size of application that you're building.

* [Architectural patterns on Wikipedia](https://en.wikipedia.org/wiki/Architectural_pattern)
* [Software design pattern on Wikipedia](https://en.wikipedia.org/wiki/Software_design_pattern)
* Continue reading on [Design Patterns](/pages/Design-Patterns.html)
88 changes: 88 additions & 0 deletions pages/Design-Patterns.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
---
layout: page
title: Design Patterns
---

# Design Patterns

There are numerous ways to structure the code and project for you web application, and you can put as much or as little
thought as you like into architecting. But it is usually a good idea to follow to common patterns because it will make
your code easier to manage and easier for others to understand.

* [Architectural pattern on Wikipedia](https://en.wikipedia.org/wiki/Architectural_pattern)
* [Software design pattern on Wikipedia](https://en.wikipedia.org/wiki/Software_design_pattern)

## Factory

One of the most commonly used design patterns is the factory pattern. This is a pattern is simply a class that creates
the object you want to use. Consider the following example of the factory pattern:

{% highlight php %}
<?php
class Automobile
{
private $vehicle_make;
private $vehicle_model;
public function __construct($make, $model)
{
$this->vehicle_make = $make;
$this->vehicle_model = $model;
}

public function get_make_and_model()
{
return $this->vehicle_make . ' ' . $this->vehicle_model;
}
}

class AutomobileFactory
{
public static function create($make, $model)
{
return new Automobile($make, $model);
}
}

// have the factory create the Automobile object
$veyron = AutomobileFactory::create('Bugatti', 'Veyron');

print_r($veyron->get_make_and_model()); // outputs "Bugatti Veyron"
{% endhighlight %}

This code uses a factory to create the Automobile object. There are two possible benefits to building your code this
way, the first is that if you need to change, rename, or replace the Automobile class later on you can do so and you
will only have to modify the code in the factory, instead of every place in your project that uses the Automobile
class. The second possible benefit is that if creating the object is a complicated job you can do all of the work in
the factory, instead of repeating it every time you want to create a new instance.

Using the factory pattern isn't always necessary (or wise). The example code used here is so simple that a factory
would simply be adding unneeded complexity. However if you are making a fairly large or complex project you may save
yourself a lot of trouble down the road by using factories.

* [Factory pattern on Wikipedia](https://en.wikipedia.org/wiki/Factory_pattern)

## Front Controller

The front controller pattern is where you have a single entrance point for you web application (e.g. index.php) that
handles all of the requests. This code is responsible for loading all of the dependencies, processing the request and
sending the response to the browser. The front controller pattern can be beneficial because it encourages modular code
and gives you a central place to hook in code that should be run for every request (such as input sanitization).

* [Front Controller pattern on Wikipedia](https://en.wikipedia.org/wiki/Front_Controller_pattern)

## Model-View-Controller

The model-view-controller (MVC) pattern and its relatives HMVC and MVVM let you break up code into logical objects that
serve very specific purposes. Models serve as a data access layer where data it fetched and returned in formats usable
throughout your application. Controllers handle the request, process the data returned from models and load views to
send in the response. And views are display templates (markup, xml, etc) that are sent in the response to the web
browser.

MVC is the most common architectural pattern used in the popular [PHP frameworks](https://github.com/codeguy/php-the-right-way/wiki/Frameworks).

Learn more about MVC and its relatives:

* [MVC](https://en.wikipedia.org/wiki/Model%E2%80%93View%E2%80%93Controller)
* [HMVC](https://en.wikipedia.org/wiki/Hierarchical_model%E2%80%93view%E2%80%93controller)
* [MVVM](https://en.wikipedia.org/wiki/Model_View_ViewModel)

0 comments on commit 2cb5960

Please sign in to comment.