Conditionally load public and admin code with AJAX working on both sides

I managed to resolve this issue by also checking for public interface. I created new function isPublic() to check if it is public. So here is my final code:

if ($this->isPublic()) {
    require_once(plugin_dir_path(dirname(__FILE__)) . 'public/class-public.php');
    $this->Public = new Public();
} elseif ($this->isAdmin()) {
    require_once(plugin_dir_path(dirname(__FILE__)) . 'admin/class-admin.php');
    $this->Admin = new Admin();
}

and here are helper isPublic() and isAdmin() functions:

public static function isAdmin() {
    if (function_exists('is_admin') && is_admin()) {
        return true;
    } else {
        if (strpos($_SERVER['REQUEST_URI'], 'wp-admin') !== false) {
            return true;
        } else {
            return false;
        }
    }
}

public static function isPublic() {
    if (function_exists('is_admin') && is_admin()) {
        if (function_exists('wp_doing_ajax') && wp_doing_ajax()) {
            return true;
        } else {
            return false;
        }
    } else {
        if (strpos($_SERVER['REQUEST_URI'], 'wp-admin') !== false) {
            if (strpos($_SERVER['REQUEST_URI'], 'admin-ajax.php') !== false) {
                return true;
            } else {
                return false;
            }
        } else {
            return true;
        }
    }
}