Então, quer dizer você anda escrevendo plugins jQuery e está confortável fazendo algo que provavelmente funcione. Legal! A questão é, você acha que talvez existam formas melhores de escrever aquilo - você tem visto diversas formas diferentes por aí, mas não tem certeza das diferenças entre os diversos padrões ou como começar com eles.

Esse projeto não busca lhe oferecer a solução perfeita para cada tipo de padrão possível, mas tenta cobrir um template simples para iniciantes ou avançados. Usando um objeto default básico, um construtor simples para trabalhar extendendo as opções default e utilizando um recurso leve para evitar problemas com múltiplas instâncias.

Baixe agora Fork no Github

Me mostre o código

// o ponto-e-vírgula antes de invocar a função é uma prática segura contra scripts
// concatenados e/ou outros plugins que não foram fechados corretamente.
;(function ( $, window, document, undefined ) {

    // 'undefined' é usado aqui como a variável global 'undefined', no ECMAScript 3 é
    // mutável (ou seja, pode ser alterada por alguém). 'undefined' não está sendo
    // passado na verdade, assim podemos assegurar que o valor é realmente indefinido.
    // No ES5, 'undefined' não pode mais ser modificado.

    // 'window' e 'document' são passados como variáveis locais ao invés de globais,
    // assim aceleramos (ligeiramente) o processo de resolução e pode ser mais eficiente
    // quando minificado (especialmente quando ambos estão referenciados corretamente).

    // Cria as propriedades padrão
    var pluginName = "defaultPluginName",
        defaults = {
            propertyName: "value"
        };

    // O verdadeiro construtor do plugin
    function Plugin( element, options ) {
        this.element = element;

        // jQuery tem um método 'extend' que mescla o conteúdo de dois ou
        // mais objetos, armazenando o resultado no primeiro objeto. O primeiro
        // objeto geralmente é vazio já que não queremos alterar os valores
        // padrão para futuras instâncias do plugin
        this.options = $.extend( {}, defaults, options );

        this._defaults = defaults;
        this._name = pluginName;

        this.init();
    }

    Plugin.prototype = {

        init: function() {
            // Coloque a lógica de inicialização aqui
            // Você já possui acesso ao elemento do DOM e as opções da instância
            // exemplo: this.element e this.options
        },

        yourOtherFunction: function(el, options) {
            // alguma lógica
        }
    };

    // Um invólucro realmente leve em torno do construtor,
    // prevenindo contra criação de múltiplas instâncias
    $.fn[pluginName] = function ( options ) {
        return this.each(function () {
            if (!$.data(this, "plugin_" + pluginName)) {
                $.data(this, "plugin_" + pluginName, new Plugin( this, options ));
            }
        });
    };

})( jQuery, window, document );

Modo de uso

$('#elem').defaultPluginName({
  propertyName: 'a custom value'
});