设计模式:UML类图、策略模式、单例模式、工厂模式、观察者模式

一、UML类图:
类与类之间存在6个关系:
1)依赖:类A用到了类B,不是成员变量中用到,而是在成员函数中用到了
在这里插入图片描述
2)关联:类A使用了类B,并且是在成员变量中用到的
在这里插入图片描述
3)聚合:和关联类似,也是使用实例化来关联,一个是整体,一个是部分
在这里插入图片描述
4)组合:相比聚合具有更强的耦合度。部分没有单独存在的意义,整体负责单独的生命周期。
在这里插入图片描述
5)继承:
在这里插入图片描述
6)实现:纯虚函数
在这里插入图片描述
二、策略模式:
在这里插入图片描述
strategy中的算法经常变化。所以将strategy中的算法作为虚函数,在派生类中进行重写。Context中包含了一个strategy对象的指针,可以根据需求将该指针指向ABC类。需要添加算法的时候,只要添加派生类,context和strategy不需要修改。

class Strategy{
	virtual AlgorithmInterface()=0;
};

class A:public Strategy{
	AlgorithmInterface();
};

class B:public Strategy{
	AlgorithmInterface();
};

class C:public Strategy{
	AlgorithmInterface();
};

Class Context{
	Strategy* strategy;//包含了一个Strategy的指针
	void ContextInterface(){
		strategy->AlgorithmInterface();//根据对象类型创建算法
}

三、单例模式: 保证一个类只有一个实例
1)懒汉版本:不到万不得已就不会去实例化类,第一次用到类实例的时候才会去实例化
2)饿汉:饥不择食,在单例类定义的时候就进行实例化
在这里插入图片描述
懒汉版本:

class Singleton
{
public:
	static Singleton* m_instance;
	static Singleton* getInstance();//在调用这个函数之前没有实例化对象,所以要写成静态函数
private://将构造函数和析构函数私有化
	static mutex SingletonMutex;//静态函数只能调用静态变量
	Singleton() {};
	~Singleton() {};
};

static Singleton::m_instance = nullptr;
static Singleton* Singleton::getInstance() {
	if (m_instance == nullptr) {//因为lock会造成效率降低,因此在先判断是否被实例化,
		SingletonMutex.lock();
		if (m_instance == nullptr) {
			m_instance = new Singleton();
		}
		SingletonMutex.unlock();
	}
	return m_instance;
}

为什么要判断两次nullptr?
当类没有被实例话的时候,两个进程同时通过了第一个nullptr,一个线程加锁并且实例化,解锁后另一个线程也会实例化。因此要两次判断。

饿汉版本:

class Singleton
{
public:
	static Singleton* m_instance;
	static Singleton* getInstance();
private:
	Singleton() {};
	~Singleton() {};
};
static Singleton::m_instance = new Singleton();//在定义的时候就被实例化,所以是线程安全的
static Singleton* Singleton::getInstance() {
	return m_instance;
}

四、工厂方法模式:
简单工厂模式,工厂类包含了逻辑判断,会根据输入来判断实例化哪一个类,但是如果要添加类的时候,需要需改工厂类,违背了开放—封闭原则。因此工厂方法定义了抽象类用于实例化对象的纯虚函数 ,他的子类来负责实例化
在这里插入图片描述

class ISplitter
{
public:
	ISplitter();
	virtual ~ISplitter(); 
	virtual void split() = 0;
};

class PictureISplitter:public ISplitter
{
public:
	PictureISplitter();
	virtual ~PictureISplitter();
	virtual void split() {};
};

class BinaryISplitter:public ISplitter
{
public:
	BinaryISplitter();
	virtual ~BinaryISplitter();
	virtual void split() {};
};

class SplitterFactory
{
public:
	SplitterFactory();
	virtual ~SplitterFactory();
	virtual ISplitter* createSplitter() = 0;
};

class PictureSplitterFactory:public SplitterFactory
{
public:
	PictureSplitterFactory();
	virtual ~SplitterFactory();
	virtual ISplitter* createSplitter{
		return new PictureISplitter();
	}
};

class BinarySplitterFactory :public SplitterFactory
{
public:
	BinarySplitterFactory();
	virtual ~BinarySplitterFactory();
	virtual ISplitter* createSplitter{
		return new BinaryISplitter();
	}
};

五、抽象工厂模式:
之前的工厂模式product只有一个,当product有多个的时候,并且product的派生类之间有依赖关系的时候,则可以用同一个具体工厂同时创建这些对象
在这里插入图片描述
六、观察者模式:
定义了一对多的依赖关系,多个观察者对同一个对象进行观察,当被观察对象发生了改变会通知所有的观察者,观察者会根据这个进行相应的措施
在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值