Вопрос: Насколько код ООП и что бы вы посоветовали по его улучшению?

Лучший ответ: <?php
// PSR-1, PSR-2, PSR-4 Читаем и пользуем!
// namespace все дела... "Model_admin" - это прошлое.
// phpDocumentor - твой друг, прописывай всюду типы данных
class Model_admin extends Model
{
// Лишний перевод строки
    private $name;
    private $password;
    private $code;
    private $mail;
// Не информативное название. get model admin... что бы это значило...
    public function get($login, $password) {
// Где проверка аргумантов? Влететь может что угодно
        $this->name = $login;
        $this->password = $password;
// Модель НЕ должна управлять подключением к БД, это должно выполняться выше в коде
        $this->db_connect();
// Код вообще проверялся?)) у вас закрывающей строки нет.
        $result = msql_query("SELECT 'login', 'password', 'mail' FROM 'admin_authorization'";
// сие уже deprecated, забудьте про mysql_*** функции, используйте PDO
        $arr = mysql_fetch_array($result);
// Зачем нужен цикл, это дро*ба БД!!! Вытягиваете одну запись по логину и проверяете соответствует ли пароль
        do {
// Лишний перевод строки
            if ($login === $arr['login']) {
// Лишний перевод строки
                if (
                    md5( md5( trim( $password ))) === $arr['password']
                ) {
                    $this->mail = $arr['mail'];
                    $this->random_code();
// Перед return лучше делать перевод строки
                    return true;
                }
// Лишний перевод строки
            }
// сие уже deprecated, забудьте про mysql_*** функции, используйте PDO
// Присваивание в условиях управляющих кнострукций лучше не делать, это операции разного характера
        } while ($arr = mysql_fetch_array($res));

        return false;
// Лишний перевод строки
    }

    private function random_code($length = 15) {
// Где проверка аргумантов? Влететь может что угодно
        $symbols = '0123456789abcdefghijklmnopqrstuvwxyz_-~!+*%$#&';

        for ($i = 0; $i < (int)$length; $i++)
        {
            $num = rand (1, strlen ($symbols));
            $this->code .= substr ($symbols, $num, 1);
        }
// сие уже deprecated, забудьте про mysql_*** функции, используйте PDO
        $bool_update = mysql_query('UPDATE "admin_authorization" SET code="'.$this->code.'" WHERE login="'.$this->name.'"');
// Вот так писать плохо, всегда используйте фигурные скобки.
        if ($bool_update) $this->send_code();
// Лишний перевод строки
    }

    private function send_code() {
// Модель НЕ должна отправлять письма, под отправку обычно пишется отдельная подсистема/сервис
        mail ($this->mail, "Admin code", $this->code);
    }

    public function check_code($user_code) {
// Где проверка аргумантов? Влететь может что угодно
// SQL инъекция!!!!
// сие уже deprecated, забудьте про mysql_*** функции, используйте PDO
        $this->code = mysql_query("SELECT 'code' FROM admin_authorization WHERE code='".$user_code."'");
// Вот так писать плохо, всегда используйте фигурные скобки.
        if ($this->code != '') return true;
    }
// Лишний перевод строки
}

Худший ответ: используйте PDO, да
ну и логику разносите
в моделе не должно быть разных "SELECT * FROM", раз вы уже про ООП заговорили
делайте отдельный класс DB и используйте его аля - $DB->getOne('TABLE', array(PARAMS))
ну и про singleton можете почитать за одно