常见的创建型设计模式( 一 )

news2024/11/25 1:08:21

设计模式( 一 )

常见的创建型设计模式

1.单例模式 : 确保一个类只有一个实例 , 为整个程序提供一个全局的访问接口。getInstance

实现方式

  • 饿汉式,在调用getInstance 创建实例的时候 ,实例已经存在了 ,不需要我们再次去 new创建。
    优点: 实现简单 , 在多线程的环境下是线程安全的。
class Singleton {
  public:
  	static Singleton* getInstance() {
  		return singleton.get();   // 返回管理的原始指针
  	}
  	~Singleton() { cout << __FUNCTION__ << endl;  }
  private:
  	Singleton() { cout << __FUNCTION__ << endl; }
  	
  
  	Singleton(const Singleton& other) = delete;
  	Singleton& operator =(const Singleton& other) = delete;
  
  	static unique_ptr< Singleton >singleton;  // 用智能指针来托管这个有生命周期的对象.避免我们手动去释放
  };
  
  unique_ptr< Singleton>Singleton::singleton( new Singleton);
  • 懒汉式,第一次使用的时候, 才初始化实例
    缺点: 不适合多线程环境( 如果要在多线程下使用 ,需要加锁 )
    优点: 节省资源
  // 利用C++11的新特性 线程安全且简单
  #include <mutex>
  
  class Singleton {
  public:
  	static Singleton* getInstance() {
  		call_once(flag, []() {   // 保存对象只 new 一次
  			singleton.reset(new Singleton);
  			});
  		return singleton.get(); // 返回管理的原始指针
  	}
  	
  	~Singleton() { cout << __FUNCTION__ << endl; }
  private:
  	Singleton() { cout << __FUNCTION__ << endl; }
  	
  	Singleton(const Singleton& other) = delete;
  	Singleton& operator =(const Singleton& other) = delete;
  
  	static unique_ptr<Singleton>singleton;
  	static once_flag flag;
  };
  
  unique_ptr< Singleton>Singleton::singleton;
  once_flag Singleton::flag;
  
  
  // 其他的写法 ,可以参考
  class Singleton {
  public:
  	static Singleton* getInstance() {
  		statict Singleton singleton;
          return &singleton;
  	}
  private:
  	Singleton() { cout << __FUNCTION__ << endl; }
      ~Singleton() { cout << __FUNCTION__ << endl; }
  	
  	Singleton(const Singleton& other) = delete;
  	Singleton& operator =(const Singleton& other) = delete;
  };
 

适用场景 : 线程池 、系统日志、内存池。等等

2.简单工厂模式: 定义一个工厂类 , 用来创建不同类型的对象实例 .
目的: 将对象创建的过程封装在工厂类里面 , 我们只需要调用工厂类的生产方法 ,而不需要关心具体的实现过程.
基本结构

  • 工厂类 —>用于创建对象的实例
  • 产品类 —> 创建对象的父类
  • 具体产品类----> 继承产品类 , 重写父类的virtual 方法.

具体实现方法:

// 产品类
class Animal {
public:
	Animal() { }; 
	virtual void eat() = 0;
	virtual void drinking() = 0;

	virtual ~Animal( ) { }
};

// 具体产品类
class Dog :public Animal {
public:
	Dog() { }
	virtual ~Dog() { }

	virtual void eat() { std::cout << "++ Dog eat" << std::endl; }
	virtual void drinking() { std::cout << "++ Dog drinking" << std::endl; }
};

// 具体产品类
class Cat :public Animal {
public:
	Cat() { }
	virtual ~Cat() { }

	virtual void eat() { std::cout << "++ Cat eat" << std::endl; }
	virtual void drinking() { std::cout << "++ Cat drinking" << std::endl; }
};

// 具体产品类
class Beef :public Animal {
public:
	Beef() { }
	virtual ~Beef() { }

	virtual void eat() { std::cout << "++ Beef eat" << std::endl;  }
	virtual void drinking() { std::cout << "++ Beef drinking" << std::endl;  }
};

// 产品类型
enum class AnimalType :char
{
	Dog,
	Cat,
	Beef
};

// 工厂类
class Factory {
public:
	Factory() { };
	~Factory() { };
	// 生产
	Animal* make_animal( AnimalType  type ) {
		Animal* animal = nullptr;
		switch ( type )
		{
		case AnimalType::Cat:
			animal = new Cat;
			break;
		case AnimalType::Dog:
			animal = new Dog;
			break;
		case AnimalType::Beef:
			animal = new Beef;
			break;
		default:
			break;
		}
		return animal;
	}
};


int main( ) {
	
    // 创建一个工厂实例 , 调用生产方法 ,生成我们需要的产品.
	Factory factory;   

	Animal* Beef = factory.make_animal(AnimalType::Beef);
	Beef->drinking();

	Animal* Dog = factory.make_animal(AnimalType::Dog);

	Dog->eat();

	system("pause");

	return 0;
}

适用场景: 创建对象的逻辑较为简单、对象类型较少。

3.工厂模式: 它定义了一个创建对象的工厂,但由工厂的子类决定生成哪一个产品。
基本结构:

  • 工厂类 —>定义生产产品的接口
  • 具体工厂类—>继承工厂类 , 对生产接口进行具体实现。返回具体的产品实例
  • 产品类—>定义产品的父类
  • 具体产品类 —> 继承产品类 ,实现产品类的具体方法。

具体的实现:

// 产品类
class Animal {
public:
	Animal() { }; 
	virtual void eat() = 0;
	virtual void drinking() = 0;

	virtual ~Animal( ) { }
};

// 具体产品类
class Dog :public Animal {
public:
	Dog() { }
	virtual ~Dog() { }

	virtual void eat() { std::cout << "++ Dog eat" << std::endl; }
	virtual void drinking() { std::cout << "++ Dog drinking" << std::endl; }
};

// 具体产品类
class Cat :public Animal {
public:
	Cat() { }
	virtual ~Cat() { }

	virtual void eat() { std::cout << "++ Cat eat" << std::endl; }
	virtual void drinking() { std::cout << "++ Cat drinking" << std::endl; }
};

// 具体产品类
class Beef :public Animal {
public:
	Beef() { }
	virtual ~Beef() { }

	virtual void eat() { std::cout << "++ Beef eat" << std::endl;  }
	virtual void drinking() { std::cout << "++ Beef drinking" << std::endl;  }
};

// 工厂类
class AbstractFactory {
public:
	AbstractFactory() { };
	virtual ~AbstractFactory() { };
	// 生产
	virtual Animal* make_animal( ) = 0;
};

// 具体工厂类
class DogFactory : public AbstractFactory {
public:
	DogFactory() { }
	virtual ~DogFactory() { }

	virtual Animal* make_animal() {
		return new Dog;
	}
};

// 具体工厂类
class CatFactory : public AbstractFactory {
public:
	CatFactory() { }
	virtual ~CatFactory() { }

	virtual Animal* make_animal() {
		return new Cat;
	}
};

// 具体工厂类
class BeefFactory : public AbstractFactory {
public:
	BeefFactory() { }
	virtual ~BeefFactory() { }

	virtual Animal* make_animal() {
		return new Beef;
	}
};

int main( ) {
	
	// 创建一个狗的工厂 ,用于生产狗
	AbstractFactory  *factory_dog = new DogFactory;
	Animal* dog = factory_dog->make_animal();

	dog->eat();

	// 创建一个猫的工厂 ,用于生产猫
	AbstractFactory* factory_cat = new CatFactory;
	Animal* cat = factory_cat->make_animal();

	cat->drinking();

	system("pause");

	return 0;
}

工厂模式是对简单工厂模式的优化 , 将生产产品的的过程延申到工厂的子类中进行实现 , 提高程序的可扩展性。

4.抽象工厂模式: 提供一系列创建产品的接口 , 无需指定具体的类.

适用于: 生产的产品结构比较复杂的类, 入电脑 , 汽车( 由很多零部件构成 , 而同一个零部件又有很多类型).

基本结构:

  • 抽象工厂—> 定义创建产品的方法.
  • 具体工厂—> 实现创建产品的方法 , 这些方法会返回一个具体的产品.
  • 抽象产品 —> 为每种产品声明一个接口.
  • 具体产品 —> 实现抽象产品的接口.
  • 客户端 —> 通过抽象工厂和抽象产品来生产产品.

例如: 建造一海贼艘船

|---------------------- --基础版-----------------豪华版----------------旗舰版 |
| 动力系统------------船桨--------------------内燃机----------------核动力 |
| 防御系统------------防空机枪--------------反舰导弹-------------激光炮 |
| 创建材料------------木头--------------------钢铁-------------------合金 |

具体实现:

#include <iostream>
#include <string>

// 动力系统抽象类
class AbstractPower {
public:
	AbstractPower() {  }
	virtual ~AbstractPower( ) { }

	virtual std::string getPower() = 0;
};

// 船桨动力
class BodyPower : public AbstractPower {
public:
	BodyPower() { }
	virtual ~BodyPower() { }

	virtual std::string getPower() {
		return std::string("< 船桨>动力系统");
	}
};

// 内燃机
class EnginePower : public AbstractPower {
public:
	EnginePower() { }
	virtual ~EnginePower() { }

	virtual std::string getPower() {
		return std::string("< 内燃机>动力系统");
	}
};

// 核动力
class EnergyPower : public AbstractPower {
public:
	EnergyPower() { }
	virtual ~EnergyPower() { }

	virtual std::string getPower() {
		return std::string("< 核能>动力系统");
	}
};

// 防御系统抽象类
class AbstractDefense {
public:
	AbstractDefense() { }
	virtual ~AbstractDefense() { }

	virtual std::string getDefense() = 0;
};

// 防空机枪
class Gun : public AbstractDefense {
public:
	Gun() { }
	virtual ~Gun() { }

	virtual std::string getDefense() {
		return std::string("<防空机枪>防御系统");
	}
};

// 反舰导弹
class Guided : public AbstractDefense {
public:
	Guided() { }
	virtual ~Guided() { }

	virtual std::string getDefense() {
		return std::string("<防空导弹>防御系统");
	}
};

// 激光炮
class Laser : public AbstractDefense {
public:
	Laser() { }
	virtual ~Laser() { }

	virtual std::string getDefense() {
		return std::string("<激光炮>防御系统");
	}
};

// 建造材料抽象类
class AbstractMaterials {
public:
	AbstractMaterials() { }
	virtual ~AbstractMaterials() { }

	virtual std::string getMaterials() = 0;
};

// 木头
class Wood :public AbstractMaterials {
public:
	Wood() { }
	virtual ~Wood() { }

	virtual std::string getMaterials() {
		return std::string("<木头>建造");
	}
};

// 钢铁
class Steel :public AbstractMaterials {
public:
	Steel() { }
	virtual ~Steel() { }

	virtual std::string getMaterials() {
		return std::string("<钢铁>建造");
	}
};

// 合金
class Alloy :public AbstractMaterials {
public:
	Alloy() { }
	virtual ~Alloy() { }

	virtual std::string getMaterials() {
		return std::string("<合金>建造");
	}
};

// 船
class Shop {
public:
	Shop(AbstractPower* power, AbstractDefense* defence, AbstractMaterials* materials):power_(power), defence_(defence), materials_( materials ){  }

	~Shop( ) { 
		delete power_;
		delete defence_;
		delete materials_;
	}
	std::string getShopInforamtion() {
		std::string info = power_->getPower() + defence_->getDefense() + materials_->getMaterials();
		return info;
	}
private:
	AbstractPower* power_;         // 动力系统
	AbstractDefense* defence_;     // 防御系统
	AbstractMaterials* materials_;  // 建造材料
};


// 工厂抽象类
class AbstractFactory {
public:
	AbstractFactory( ) { }
	virtual ~AbstractFactory() { }

	virtual Shop* CreateShop() = 0;
};

class BasicShop :public AbstractFactory {
public:
	BasicShop( ) { }
	virtual ~BasicShop( ){ }

	virtual Shop* CreateShop() {
		Shop* shop = new Shop(new BodyPower, new Gun, new Wood);
		std::cout << "<基础形>海贼船建造完毕" << std::endl;
		return shop;
	}
};

// 
class LuxuryShop :public AbstractFactory {
public:
	LuxuryShop() { }
	virtual ~LuxuryShop() { }

	virtual Shop* CreateShop() {
		Shop* shop = new Shop(new EnginePower, new Guided, new Steel);
		std::cout << "<豪华型>海贼船建造完毕" << std::endl;
		return shop;
	}
};

class FlagshipShop :public AbstractFactory {
public:
	FlagshipShop() { }
	virtual ~FlagshipShop() { }

	virtual Shop* CreateShop() {
		Shop* shop = new Shop( new EnergyPower , new Laser, new Alloy);
		std::cout << "<旗舰型>海贼船建造完毕" << std::endl;
		return shop;
	}
};

int main() {
	
	AbstractFactory* factory = new BasicShop;
	Shop *shop = factory->CreateShop();
	std::cout << shop->getShopInforamtion() << std::endl;

	return 0;
}

效果演示:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1840145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytorch编写Transformer

本文参考自https://github.com/datawhalechina/learn-nlp-with-transformers/blob/main/docs/ 在学习了图解Transformer以后&#xff0c;需要用Pytorch编写Transformer&#xff0c;下面是写代码的过程中的总结&#xff0c;结构根据图解Transformer进行说明。 import numpy as …

stable diffusion 局部重绘 reference-only api 接口调试

webUI api payload 插件生成的接口参数不准确&#xff0c;reference-only 的image不是对象&#xff0c;就是不同字符串字段&#xff0c;直接传&#xff0c;不是套image。 综上&#xff0c;那个插件参数不确定&#xff0c;应直接看插件的源码&#xff0c;看它接受什么参数 错误…

校园车辆管理系统的设计与实现

第1章 绪论 1.1 研究背景与意义 随着高等教育的普及和扩张&#xff0c;大学校园已成为一个综合性的小型社会。教学楼、实验室、宿舍、体育设施等构成了庞大且复杂的校园基础设施。在这样的环境下&#xff0c;教师、学生、家长及访客的车辆数量也随之增多&#xff0c;这不仅带来…

UI设计师是不是青春饭?你摆烂,啥工作都是青春饭!

一、UI设计师的岗位职责包括&#xff1a; 用户研究和需求分析&#xff1a;了解用户需求、行为和偏好&#xff0c;进行用户调研和用户体验测试&#xff0c;以便设计出符合用户期望的界面。制定设计方案&#xff1a;根据用户需求和产品定位&#xff0c;制定UI设计方案&#xff0c…

[手机Linux PostmarketOS]一,1加6T真正的手机Linux系统

前面用Linux deploy软件安装了Linux系统在手机&#xff0c;实则不是真正的手机刷成了linux系统&#xff0c;而是通过Linux deploy软件在容器里安装了Linux系统&#xff0c;在使用方面会有诸多限制&#xff0c;并不能发挥Linux的真实强大之处&#xff0c;于是我又百度又谷歌(真不…

标准化的力量:如何通过PDM提升企业研发效率

在当今竞争激烈的市场环境中&#xff0c;企业必须不断优化其产品开发流程以保持竞争力。PDM产品数据管理系统与企业标准化的结合&#xff0c;为企业提供了一种有效的方法来管理和优化其研发流程。本文将探讨PDM与企业标准化的概念&#xff0c;它们在企业中的相互作用&#xff0…

上市公司-社会责任报告、ESG报告文本(2006-2023年)

上市公司社会责任报告是企业对外公布的一份关于其社会责任实践和成果的详细文件&#xff0c;涵盖环境保护、社会贡献和公司治理等方面的表现。通常包含公司在减少环境影响、提升社会福祉、维护员工权益、促进社区发展以及确保透明和道德的管理实践等方面的信息和数据。有助于了…

基于Pytorch框架的深度学习Swin-Transformer神经网络食物分类系统源码

第一步&#xff1a;准备数据 5种鸟类数据&#xff1a;self.class_indict ["苹果派", "猪小排", "果仁蜜饼", "生牛肉薄片", "鞑靼牛肉"] &#xff0c;总共有5000张图片&#xff0c;每个文件夹单独放一种数据 第二步&…

PS系统教程23

减淡加深海绵工具 减淡工具 作用&#xff1a;提炼物体颜色 加深工具 作用&#xff1a;变暗物体颜色&#xff0c;加深物体深度 海绵工具 作用&#xff1a;修正物体饱和度&#xff0c;加大纯度 减淡工具 老套路&#xff0c;找一个图片 复制新建粘贴Ctrl键J复制图层选择减…

WinRAR应用文件图标是白色怎么解决

1.打开程序-选项-设置 2.找到集成-选择全部切换&#xff0c;保存即可。

找不到concrt140.dll无法继续执行代码的几种解决方法

在数字时代&#xff0c;电脑用户经常会遇到各种技术问题&#xff0c;其中DLL文件缺失是最常见的问题之一。今天&#xff0c;我们将重点介绍CONCRT140.DLL文件的重要性&#xff0c;以及当它丢失时对电脑的影响。同时&#xff0c;我们提供了五种解决方法和预防措施&#xff0c;帮…

浅谈RC4

一、什么叫RC4&#xff1f;优点和缺点 RC4是对称密码&#xff08;加密解密使用同一个密钥&#xff09;算法中的流密码&#xff08;一个字节一个字节的进行加密&#xff09;加密算法。 优点&#xff1a;简单、灵活、作用范围广&#xff0c;速度快 缺点&#xff1a;安全性能较差&…

24.bytebuf创建

1.byteBuf创建方法 2.自动动态扩容的 package com.xkj.bound;import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j;@Slf4j public class TestByteBuf {public static void main(String[] args) {//bytebuf可以不指定…

【计算机网络体系结构】计算机网络体系结构实验-配置WinPcap

清清存货UAU ------------------------------------------------------------------------- 一、在CodeBlocks中配置WinPcap 1. 运行WinPcap安装包 2. 官网下载codeblocks 安装 安装成功 3. 测试 新建一个工程&#xff0c;选择Console application 创建成功 4. 配置 在寻找…

2713. 矩阵中严格递增的单元格数

题目 给定一个 m x n 的整数矩阵 mat&#xff0c;我们需要找出从某个单元格出发可以访问的最大单元格数量。移动规则是可以从当前单元格移动到同一行或同一列的任何其他单元格&#xff0c;但目标单元格的值必须严格大于当前单元格的值。需要返回最大可访问的单元格数量。 示例…

【profinet】从站开发要点

目录 0、常见缩写及关键字注释 1、profinet简介 2、profinet协议栈 3、profinet数据帧 4、profinet网络解决方案示例 5、Application areas 注&#xff1a;本文主要简述profinet从站开发涉及到的知识点。【不足之处后续慢慢补充】。 0、常见缩写及关键字注释 MRP: Media…

服务器流量收发测试

文章目录 一、概述二、实现方式一&#xff1a;编码1. 主要流程2. 核心代码3. 布署 三、实现方式二&#xff1a;脚本1.脚本编写2. 新增crontab任务 四、查看结果 一、概述 我们在安装vnStat、wondershaper便想通过实际的数据收发来进行测试。 二、实现方式一&#xff1a;编码 …

C++ Windows Hook使用

GitHub - microsoft/Detours: Detours is a software package for monitoring and instrumenting API calls on Windows. It is distributed in source code form. /*挂载钩子 setdll /d:C:\Users\g\source\repos\LotTest\Release\lotDll.dll C:\Users\g\source\repos\LotTest…

【SpringBoot】RSA加密(非对称加密)

一、关于RSA RSA是一种非对称加密算法&#xff0c;广泛应用于数据加密和数字签名领域。 RSA算法是由罗纳德李维斯特&#xff08;Ron Rivest&#xff09;、阿迪萨莫尔&#xff08;Adi Shamir&#xff09;和伦纳德阿德曼&#xff08;Leonard Adleman&#xff09;在1977年提出的。…