自学内容网 自学内容网

C++ 设计模式

目录

一、单例

二、工厂

1.简单工厂:

2.工厂方法

3.抽象工厂

三、观察者

四、策略模式


一、单例

C++11语法规定,局部静态变量在第一次使用时进行初始化,如果存在多线程访问的情况,需要保证其初始化是线程安全性的。

底层原理:反汇编查看C++静态局部变量 ;说白了还是锁,只不过这段代码由编译器帮忙生成。

单例代码:

class Singleton {
public:
static Singleton& getInstance()
{
static Singleton s;
return s;
}

void work()
{
cout << "I am a Singleton" << endl;
}
private:
Singleton() {}
Singleton(const Singleton&other){}
~Singleton(){}
};

二、工厂

1.简单工厂:

工厂生成产品,需要什么产品类型就传入参数。

缺点:如果新增产品,就需要修改工厂代码。

优点:简单。

class Product {
public:
virtual void show(){}
virtual ~Product() {}
};


class ProductA :public Product {
public:
void show() {
cout << "this is productA" << endl;
}
};

class ProductB :public Product {
public:
void show() {
cout << "this is productB" << endl;
}
};


class EasyFactory {
public:
static shared_ptr<Product> GetProduct(const string& type) {
if (type == "A")
{
return make_shared<ProductA>();
}
else if (type == "B")
{
return make_shared<ProductA>();
}
else {
return nullptr;
}
}
};

2.工厂方法

相对于简单工厂,优点是增加产品时,不需要修改工厂代码,而是新开一个工厂。

因为存在一个抽象工厂类,所以增加产品时,也需要增加一个生产这个产品的工厂类。


class Product {
public:
virtual void show(){}
virtual ~Product() {}
};


class ProductA :public Product {
public:
void show() {
cout << "this is productA" << endl;
}
};

class ProductB :public Product {
public:
void show() {
cout << "this is productB" << endl;
}
};


class Factory {
public:
virtual shared_ptr<Product> createProduct() = 0;
virtual ~Factory() {}
};

class FactoryA :public Factory
{
public:
shared_ptr<Product> createProduct()
{
return make_shared< ProductA>();
}
};

3.抽象工厂

抽象工厂通常会定义多个工厂方法,每个工厂方法用于创建一个特定类型的产品。

#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <unordered_map>
#include <stack>
#include <queue>
#include <algorithm>
#include <numeric>
#include <thread>
#include <mutex>
#include <functional>

using namespace std;

//抽象角色
class Character {
public:
virtual void show() = 0;
};

//抽象武器
class Weapon {
public:
virtual void show()= 0;
};

//魔法世界的角色
class MagicCharacter:public Character {
public:
void show() override
{
cout << "it's magic charactor" << endl;
}

};

//魔法世界的武器
class MagicWeapon:public Weapon {
public:
void show() override
{
cout << "it's magic weapon" << endl;
}
};

//科学世界的角色
class ScienceCharacter:public Character {
public:
void show() override
{
cout << "it's science charactor" << endl;
}
};

//科学世界的武器
class ScienceWeapon:public Weapon {
public:
void show() override
{
cout << "it's science weapon" << endl;
}
};


//抽象工厂
class AbstractFactory {
public:
virtual shared_ptr<Character> createCharacter() = 0;
virtual shared_ptr<Weapon> createWeapon() = 0;
};

//魔法世界工厂
class MagicFactory {
public:
shared_ptr<Character> createCharacter()
{
return make_shared<MagicCharacter>();
}
shared_ptr<Weapon> createWeapon()
{
return make_shared<MagicWeapon>();
}
};

//科学世界工厂
class ScienceFactory {
public:
shared_ptr<Character> createCharacter()
{
return make_shared<ScienceCharacter>();
}
shared_ptr<Weapon> createWeapon()
{
return make_shared<ScienceWeapon>();
}
};


int main()
{
shared_ptr<MagicFactory> sp_mf = make_shared<MagicFactory>();
auto mc = sp_mf->createCharacter();
auto mw = sp_mf->createWeapon();
mc->show();
mw->show();


shared_ptr<ScienceFactory> sp_sf = make_shared<ScienceFactory>();
auto sc = sp_sf->createCharacter();
auto sw = sp_sf->createWeapon();
sc->show();
sw->show();
}

三、观察者

对象间的一对多关系,当一个对象状态发生改变时,依赖于它的对象都会得到通知并更新状态。

可以用于:消息队列系统、事件处理系统、数据库变更通知

#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <unordered_map>
#include <stack>
#include <queue>
#include <algorithm>
#include <numeric>
#include <thread>
#include <mutex>
#include <functional>

class Observer {
public:
virtual void update() = 0;
virtual ~Observer() {}
};


class ObserverA :public Observer {
public:
void update()
{
cout << "ObserverA update" << endl;
}
};

class ObserverB :public Observer {
public:
void update()
{
cout << "ObserverB update" << endl;
}
};

class Subject {
public:
virtual void attach(std::shared_ptr<Observer> observer) = 0;
virtual void detach(std::shared_ptr<Observer> observer) = 0;
virtual void notify() = 0;
private:
vector<std::shared_ptr<Observer>> observers;
};

class SubjectA {
public:
virtual void attach(std::shared_ptr<Observer> observer)
{
this->observers.push_back(observer);
}
virtual void detach(std::shared_ptr<Observer> observer)
{
auto it = std::find(observers.begin(), observers.end(), observer);
if (it != observers.end())
{
this->observers.erase(it);
}
}
virtual void notify()
{
for (auto &it : observers)
{
it->update();
}
}
private:
vector<std::shared_ptr<Observer>> observers;
};


int main()
{
shared_ptr<Observer> sp_OA = make_shared< ObserverA>();
shared_ptr<Observer> sp_OB = make_shared< ObserverB>();

shared_ptr<SubjectA> sp_SA = make_shared< SubjectA>();

sp_SA->attach(sp_OA);
sp_SA->attach(sp_OB);
sp_SA->notify();


sp_SA->detach(sp_OB);
sp_SA->notify();
}

四、策略模式

定义了一组算法,使得它们可以相互替代;让算法独立于使用他们的客户而独立变化。

优点:1、算法可以自由切换 2、避免使用多重条件判断 3、扩展性好。


class Strategy {
public:
virtual void exec() = 0;
virtual ~Strategy() {}
};

class StrategyA:public Strategy{
public:
void exec() override
{
cout << "exec A" << endl;
}
};

class StrategyB:public Strategy {
public:
void exec() override
{
cout << "exec B" << endl;
}
};


class Context {
private:
unique_ptr<Strategy> m_strategy;
public:
void setStrategy(unique_ptr<Strategy> strategy)
{
this->m_strategy = std::move(strategy);
}

void execStrategy()
{
if (this->m_strategy != nullptr)
{
this->m_strategy->exec();
}
else
{
cout << "Context's strategy is not set" << endl;
}
}
};


int main()
{
Context ctx;

unique_ptr<Strategy> sp_sa = make_unique< StrategyA>();
unique_ptr<Strategy> sp_sb = make_unique< StrategyB>();

ctx.setStrategy(std::move(sp_sa));
ctx.execStrategy();

ctx.setStrategy(std::move(sp_sb));
ctx.execStrategy();

return 0;
}


原文地址:https://blog.csdn.net/qq_42170897/article/details/137697312

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!