4. Which design pattern is used in the following code?

#include <cassert>
#include <string>

template<typename T>
class SqlStoredProcedureCall
{
public:
    SqlStoredProcedureCall(const std::string &sp_name)
        : m_sp_name(sp_name)
        , m_sql_call()
    {
        assert(!sp_name.empty());
    }

public:
    int operator()(const std::string &p) const
    {
        assert(!p.empty());
        assert(!m_sp_name.empty());
        const std::string &sql = m_sql_call.compose(m_sp_name, p);
        return call_sp(sql);
    }

private:
    int call_sp(const std::string &sql) const;

private:
    std::string m_sp_name;
    const T m_sql_call;
};

struct MsSqlServerAndSybaseCall
{
public:
    std::string compose(const std::string &sp_name, const std::string &p) const
    {
        assert(!sp_name.empty());
        assert(!p.empty());
        return "EXECUTE " + sp_name + " '" + p + "'";
    }
};

struct OracleAndMySqlCall
{
public:
    std::string compose(const std::string &sp_name, const std::string &p) const
    {
        assert(!sp_name.empty());
        assert(!p.empty());
        return "CALL " + sp_name + "('" + p + "')";
    }
};

struct PostgreSqlCall
{
public:
    std::string compose(const std::string &sp_name, const std::string &p) const
    {
        assert(!sp_name.empty());
        assert(!p.empty());
        return "SELECT " + sp_name + "('" + p + "')";
    }
};