What's the best approach to building a photo gallery in Craft? I'm thinking about the best way to implement a photo gallery in Craft.

A channel section with an assets field should do the job, but would like to hear how other devs have approached this problem.
Craft is so flexible there are many ways to do most things, it is up to you to determine what is best for your needs.

As far as photo galleries go, there are two main ways that I normally approach this:

Method 1: 

Define asset fields for the images, where you define the photo title and description, etc.  These fields are accessed by double clicking the image, which will pull up a form with the fields you have defined.  This method associates these fields directly to the assets themselves, and the data will be available site-wide, not just in the gallery.   

While this is simplest to code, it does have the drawback that clients will often skip over the asset fields and add images to the gallery that have not been assigned all of the data needed for the gallery.

Method 2:

Use a matrix block to define the gallery and create matrix fields for the assets and associated fields.  This is much easier for clients as they can see each bit of data they need to enter, and you can even make the fields required so they do not avoid entering them.

While much simpler for the client, this method does has several drawbacks. First, the data entered into the matrix block will only be available in the context of the gallery and not anywhere else in the site. Second, a gallery built from matrix blocks can become quite lengthy in the back end and take up a lot of space on the edit page. And lastly, this method is a bit more complex to code than just a simple assets loop. Once you get the hang of it it is no biggy, but you will need to work through nested matrix/asset loops the first time.

Here is the code I use for a very simple matrix based gallery w/o titles or descriptions, best of luck :)

{% set vertParams = {
  height: 800,
  mode: 'crop',
  position: 'center-center',
}
%}
{% set horzParams = {
  width: 800,
  mode: 'crop',
  position: 'center-center',
}
%}
{% set thumbParams = {
  width: 120,
  height: 120,
  mode: 'crop',
  position: 'center-center',
}
%}
{% set images = contentBlock.galleryImages %}
{% if images | length %}
  {% if contentBlock.galleryTitle | length %}
   &lt;h3&gt;{{ contentBlock.galleryTitle }}&lt;/h3&gt;
  {% endif %}
  &lt;ul class="gallery"&gt;
    {% for image in images %}
    &lt;li&gt;
      {% if image.getHeight() &gt; image.getWidth() %}
        &lt;a href="{{ image.getURL(vertParams) }}"&gt;&lt;img src="{{ image.getURL(thumbParams) }}" alt="image"&gt;&lt;/a&gt;
      {% else %}
        &lt;a href="{{ image.getURL(horzParams) }}"&gt;&lt;img src="{{ image.getURL(thumbParams) }}" alt="image"&gt;&lt;/a&gt;
      {% endif %}
    &lt;/li&gt;
    {% endfor %}
  &lt;/ul&gt;
{% endif %}