Da das Null Object oft zustandslos ist, kann man es als Singleton implementieren, um Speicher zu sparen:
#include <iostream>
#include <memory>
// Abstrakte Basisklasse
class Logger {
public:
virtual void log(const std::string& message) = 0;
virtual ~Logger() = default;
};
// Konkrete Implementierung
class ConsoleLogger : public Logger {
public:
void log(const std::string& message) override {
std::cout << "Log: " << message << std::endl;
}
};
// Null Object – Singleton
class NullLogger : public Logger {
public:
void log(const std::string& message) override {
// tut nichts
}
// Zugriff auf die Singleton-Instanz
static NullLogger& instance() {
static NullLogger instance; // garantiert nur eine Instanz
return instance;
}
private:
NullLogger() = default;
~NullLogger() = default;
// Verhindern von Kopien und Zuweisungen
NullLogger(const NullLogger&) = delete;
NullLogger& operator=(const NullLogger&) = delete;
};
void process(Logger& logger) {
logger.log("Verarbeite Daten...");
}
int main() {
ConsoleLogger realLogger;
process(realLogger);
// Verwendung des Null Object Singletons
process(NullLogger::instance());
return 0;
}