在Ubuntu上使用C++实现设计模式,首先需要了解常见的设计模式及其应用场景。以下是一些常用的设计模式以及如何在C++中实现它们的简要指南:
单例模式确保一个类只有一个实例,并提供一个全局访问点。
实现示例:
#include <iostream>
#include <mutex>
class Singleton {
public:
static Singleton& getInstance() {
std::call_once(initFlag, &Singleton::initSingleton);
return *instance;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() {}
~Singleton() {}
static void initSingleton() {
instance = new Singleton();
}
static std::once_flag initFlag;
static Singleton* instance;
};
std::once_flag Singleton::initFlag;
Singleton* Singleton::instance = nullptr;
int main() {
Singleton& s = Singleton::getInstance();
return 0;
}
工厂模式提供了一种创建对象的方式,而无需指定具体的类。
实现示例:
#include <iostream>
#include <memory>
class Product {
public:
virtual void use() = 0;
virtual ~Product() {}
};
class ConcreteProductA : public Product {
public:
void use() override {
std::cout << "Using ConcreteProductA" << std::endl;
}
};
class ConcreteProductB : public Product {
public:
void use() override {
std::cout << "Using ConcreteProductB" << std::endl;
}
};
class Creator {
public:
virtual std::unique_ptr<Product> factoryMethod() = 0;
virtual ~Creator() {}
};
class ConcreteCreatorA : public Creator {
public:
std::unique_ptr<Product> factoryMethod() override {
return std::make_unique<ConcreteProductA>();
}
};
class ConcreteCreatorB : public Creator {
public:
std::unique_ptr<Product> factoryMethod() override {
return std::make_unique<ConcreteProductB>();
}
};
int main() {
std::unique_ptr<Creator> creator = std::make_unique<ConcreteCreatorA>();
std::unique_ptr<Product> product = creator->factoryMethod();
product->use();
creator = std::make_unique<ConcreteCreatorB>();
product = creator->factoryMethod();
product->use();
return 0;
}
观察者模式定义了对象之间的一对多依赖关系,当一个对象改变状态时,所有依赖它的对象都会收到通知并自动更新。
实现示例:
#include <iostream>
#include <vector>
#include <algorithm>
class Observer {
public:
virtual void update(int value) = 0;
virtual ~Observer() {}
};
class Subject {
public:
void attach(Observer* observer) {
observers.push_back(observer);
}
void detach(Observer* observer) {
observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
}
void notify(int value) {
for (Observer* observer : observers) {
observer->update(value);
}
}
private:
std::vector<Observer*> observers;
};
class ConcreteObserver : public Observer {
public:
ConcreteObserver(Subject& subject, int id) : subject(subject), id(id) {
subject.attach(this);
}
~ConcreteObserver() {
subject.detach(this);
}
void update(int value) override {
std::cout << "Observer " << id << " received value: " << value << std::endl;
}
private:
Subject& subject;
int id;
};
int main() {
Subject subject;
ConcreteObserver observer1(subject, 1);
ConcreteObserver observer2(subject, 2);
subject.notify(42);
return 0;
}
策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。
实现示例:
#include <iostream>
#include <memory>
class Strategy {
public:
virtual void execute() = 0;
virtual ~Strategy() {}
};
class ConcreteStrategyA : public Strategy {
public:
void execute() override {
std::cout << "Executing strategy A" << std::endl;
}
};
class ConcreteStrategyB : public Strategy {
public:
void execute() override {
std::cout << "Executing strategy B" << std::endl;
}
};
class Context {
public:
Context(std::unique_ptr<Strategy> strategy) : strategy(std::move(strategy)) {}
void setStrategy(std::unique_ptr<Strategy> strategy) {
this->strategy = std::move(strategy);
}
void executeStrategy() {
strategy->execute();
}
private:
std::unique_ptr<Strategy> strategy;
};
int main() {
auto strategyA = std::make_unique<ConcreteStrategyA>();
Context context(std::move(strategyA));
context.executeStrategy();
auto strategyB = std::make_unique<ConcreteStrategyB>();
context.setStrategy(std::move(strategyB));
context.executeStrategy();
return 0;
}
在Ubuntu上使用C++实现设计模式时,需要注意以下几点:
std::unique_ptr
、std::shared_ptr
)来管理资源,避免内存泄漏。通过以上示例和指南,你可以在Ubuntu上使用C++实现常见的设计模式。