当前位置: 首页 > news >正文

常见的设计模式

工厂模式

这个模式有三个对象:工厂、用户、产品;这么说可能还有点抽象,说的具体点,就是当我们
在代码中需要获取一个类的时候,不直接去拿到这个类名,然后new;而是通过一个工厂
类(例如EntityFactory),然后通过给这个工厂类传要创建的类型名字,然后拿到对应生
成的类;这样做的好处是将对象的构造和使用的地方隔离,使之模块化。

例如:
EntityFactory.instance().register_entity(etype, claz)//注册
EntityFactory.instance().create_entity(‘PlayerHero’, None)//使用

单例模式

使内存中只存在一个对象,通常是私有构造函数、静态公共获取函数、私有静态自身成员;创建单例的方式有
懒汉模式、饿汉模式、静态内部类实现等。

#ifndef __SINGLETON__
#define __SINGLETON__
#include<iostream>
#include<string>
#include"Singleton.h"
using namespace std;

class Singleton1 // 懒汉模式
{
private:
	static Singleton1* _instance;
	Singleton1()=default;
	Singleton1(const Singleton1&) = delete;
	Singleton1& operator=(const Singleton1&) = delete;

public:
	static Singleton1* GetInstance()
	{
		if (_instance == NULL)
		{
			_instance = new Singleton1();
		}
		return _instance;
	}
};
Singleton1* Singleton1::_instance;

class Singleton2 // 饿汉模式
{
private:
	static Singleton2* _instance;
	Singleton2() {};

	Singleton2(const Singleton2&) = delete;
	Singleton2& operator=(const Singleton2&) = delete;

public:
	static Singleton2* GetInstance()
	{
		if (_instance == NULL)
		{
			_instance = new Singleton2();
		}
		return _instance;
	}
};

Singleton2* Singleton2::_instance;


class Singleton3 // 局部静态变量实现,还有一种是加锁模式,比较麻烦且耗,需要的百度下就行了
{
private:
	Singleton3() {};
public:
	static Singleton3& GetInstance()
	{

		static Singleton3  instance;
		return instance;
	}
};

#endif // !__SINGLETON__

观察者模式

当一个事件发生时,需要去通知其他订阅者;例如游戏里面常见的领完奖励之后刷新UI界面等等。

策略模式

多种方式打到一种目的,例如网页的登录:手机登录、扫码登录、账号密码登录等,都是为了登录到同一个账号。

代理模式

在真是的某个对象上再包一层代码,可以很方便的扩展其功能;例如游戏中的相机,我们可以在原生相机的基础上包装一层,然后可以在这一层代理里面加一些保护、实现一些原生接口函数的组合功能等。

装饰模式

可以对原来的函数或者类进行扩展;对于类的装饰,可以实现组件式的代码结构,使得各个功能可以和方便的添加与删除,并且代码的逻辑也会很清晰;实现的功能是以组件的形式实现与继承相似的效果。

相关文章:

  • 【我不熟悉的javascript】02. 使用token和refreshToken的管理用户登录状态
  • 备战秋招涵盖二十九大技术栈Java面试最新八股文来袭
  • tensorflow张量运算
  • 论文阅读笔记StyTr2: Image Style Transfer with Transformers
  • mybatis面试题及回答
  • 奔腾电力面试题
  • 【leetcode】905. 按奇偶排序数组 (简单)
  • Java--MybatisPlus入门;与Mybatis区别;简单使用(一)
  • #ubuntu# #git# repository git config --global --add safe.directory
  • 【数据结构】——二叉树oj题详解
  • 性能测试:工具篇:Jmeter实时可视化平台搭建
  • 你该用什么的美剧学英语?
  • 面试算法 二叉树的遍历,方法 :迭代 ,前序遍历: 中序遍历: 后序遍历: 层序遍历
  • Matlab常用函数(control)
  • 推荐10款好用的数据可视化工具,赶紧收藏
  • ➹使用webpack配置多页面应用(MPA)
  • 10个确保微服务与容器安全的最佳实践
  • 30秒的PHP代码片段(1)数组 - Array
  • AHK 中 = 和 == 等比较运算符的用法
  • crontab执行失败的多种原因
  • in typeof instanceof ===这些运算符有什么作用
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Java读取Properties文件的六种方法
  • React组件设计模式(一)
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 从零开始在ubuntu上搭建node开发环境
  • 复习Javascript专题(四):js中的深浅拷贝
  • 关于Flux,Vuex,Redux的思考
  • 聊聊sentinel的DegradeSlot
  • 码农张的Bug人生 - 见面之礼
  • 前端性能优化--懒加载和预加载
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 你对linux中grep命令知道多少?
  • linux 淘宝开源监控工具tsar
  • 通过调用文摘列表API获取文摘
  • ​​​​​​​​​​​​​​Γ函数
  • ​用户画像从0到100的构建思路
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #ifdef 的技巧用法
  • #pragma data_seg 共享数据区(转)
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (2)nginx 安装、启停
  • (2)STM32单片机上位机
  • (2020)Java后端开发----(面试题和笔试题)
  • (a /b)*c的值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (八)c52学习之旅-中断实验
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二)linux使用docker容器运行mysql
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器