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

设计模式( 一 )

常见的创建型设计模式

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.mzph.cn/diannao/32423.shtml

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

相关文章

修复 Android 手机卡在启动屏幕上的 7 种方法

Android 手机卡在启动屏幕上的情况并不常见。通常&#xff0c;问题出现在应用新更新或安装未知来源的应用程序后。幸运的是&#xff0c;您可以让您的 Android 手机跳过启动屏幕&#xff0c;而无需前往最近的服务中心。 当您的 Android 手机在启动屏幕上陷入无限循环时&#xf…

标准立项 | 《温室气体排放核算与报告要求 废油资源化企业》

《温室气体排放核算与报告要求 废油资源化企业》适用于废油资源化行业企业温室气体排放量的核算和报告。从事废油资源化生产的企业&#xff0c;均可参考该标准核算企业的温室气体排放量&#xff0c;并编制企业温室气体排放报告。 参编咨询&#xff1a;中华环保联合会水环境治理…

ECharts 蓝色系-荧光图标折线图01案例

ECharts 蓝色系-荧光图标折线图01案例 图表意义 本折线图案例展示了一周内不同路线的使用情况或数据统计。通过折线的上升和下降&#xff0c;可以直观地观察到每条路线的流量或数据变化趋势&#xff0c;从而进行分析和决策。 效果预览 效果图展示不同路线的数据统计和个性化…

<Rust><iced>在iced中显示gif动态图片的一种方法

前言 本文是在rust的GUI库iced中在窗口显示动态图片GIF格式图片的一种方法。 环境配置 系统&#xff1a;window 平台&#xff1a;visual studio code 语言&#xff1a;rust 库&#xff1a;iced、image 概述 在iced中&#xff0c;提供了image部件&#xff0c;从理论上说&…

链表中环的入口节点

链表中环的入口节点 描述 链表中环的入口节点 给一个长度为n链表&#xff0c;若其中包含环&#xff0c;请找出该链表的环的入口结点&#xff0c;否则&#xff0c;返回null。 数据范围&#xff1a; n≤10000&#xff0c; 1<结点值<10000 要求&#xff1a;空间复杂度 O(1)…

前后端交互的弯弯绕绕

前后端交互&#xff1a; &#x1f197;&#xff0c;收拾一下心情让我们来聊一聊AJax吧&#xff0c;随着前端的飞速发展&#xff0c;前后的交互也发生了天翻地覆的变化&#xff1a; 前后端交互的方式有很多&#xff1a; AJAX、表单提交、WebSocket、RESTful API、... 这对新入…

基于Java学生选课管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

NSSCTF-Web题目14

目录 [CISCN 2019华东南]Web11和[NISACTF 2022]midlevel 1、题目 2、知识点 3、思路 [HDCTF 2023]SearchMaster 1、题目 2、知识点 3、思路 [CISCN 2019华东南]Web11和[NISACTF 2022]midlevel 这两道题目一样 1、题目 2、知识点 SSTI&#xff08;服务端模板注入漏洞&…

有哪些骨传导耳机是比较推荐入手的?精选五款热门骨传导耳机推荐!

耳机基本是每人人手一台&#xff0c;不管是在地铁上还是在公交上&#xff0c;都可以看到很多人戴着耳机度过空余的时光&#xff0c;甚至现在人们在耳机的选择方面更加偏向于骨传导耳机&#xff0c;开放耳道的奇特设计在户外佩戴的时候可以更好的感知到周围的环境音&#xff0c;…

Github 2024-06-22 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-22统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目3JavaScript项目2Python项目2HTML项目1Rust项目1Dart项目1Dockerfile项目1Shell项目1C++项目1Swift项目1RustDesk: 用Rust编写的…

小程序 获取插件用户openpid?

接口英文名 getPluginOpenPId 功能描述 通过 wx.pluginLogin 接口获得插件用户标志凭证 code 后传到开发者服务器&#xff0c;开发者服务器调用此接口换取插件用户的唯一标识 openpid。 调用方式 HTTPS 调用 第三方调用 调用方式以及出入参和HTTPS相同&#xff0c;仅是调…

跨境电商-Ozon平台开店指南-魔行观察

商家入驻开店指南 第1步&#xff1a;注册并激活您的帐户 对于独联体以外的卖家&#xff1a;法人实体可以在平台上注册。如果您是个体经营户&#xff0c;请您首先开设一家公司。个体经营户&#xff08;土耳其的个体经营户除外&#xff09;不能在我们的平台上注册。 进行注册 …

MarkDown基础

一、MarkDown标题 1.使用和-表示一级标题 2.使用#、##、###、####、######、######表示一级至六级标题 一级标题 二级标题 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 二、MarkDown标题 1.Markdown 段落没有特殊的格式&#xff0c;直接编写文字就好&#xff0c;…

攻防世界-pdf

方法一&#xff1a;打开是pdf格式的文件&#xff0c;里面有一张图&#xff0c;题目提示图下面什么都没有&#xff1f;emmm用chrom打开pdf——ctrlf搜索flag&#xff0c;里面是有东西的&#xff0c;ctrla复制就可以了。 方法二&#xff1a;题目提示图下面什么都没有&#xff0c;…

FaceFusionSharp OnnxRuntime版 视频换脸

FaceFusionSharp OnnxRuntime版 视频换脸 目录 效果 项目 代码 下载 其他 效果 FaceFusionSharp OnnxRuntime版效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Threading; using System.Window…

炸裂!Claude 3.5 正式发布!超越 GPT-4o!

Anthropic 又憋了个大招&#xff01;推出了 Claude 3.5 Sonnet&#xff01;速度是 Claude 3 的两倍&#xff01;而且数学和编码能力已经超过了 GPT-4o&#xff01; 官方声称&#xff1a;这是我们迄今为止最智能的模型。 直接看测评图&#xff0c;很多指标都吊打 GPT-4o&#xf…

慧天卓特:6月18日FYDI旱情监测分析

旱情监测 - 6月18日 重点干旱区域FYDI监测图 黄淮海流域和新疆内蒙甘肃干旱区域分布地图如下所示&#xff1a; 图1 重点旱情区域FYDI分布图 &#xff08;上&#xff1a;黄淮海流域&#xff1b;下&#xff1a;新疆内蒙甘肃地区&#xff09; 重点省市干旱面积占比统计 重点省…

(四十二)Vue之路由及其基本使用Vue Router

文章目录 概念基本使用demo几个注意点 上一篇&#xff1a;&#xff08;四十一&#xff09;Vuex之模块化与命名空间 下一篇&#xff1a;&#xff08;四十三&#xff09;Vue Router之嵌套路由 概念 在计算机科学和网络领域中&#xff0c;路由&#xff08;Routing&#xff09;是…

java基于ssm+jsp 母婴用品网站

1管理员功能模块 管理员登录&#xff0c;管理员通过输入用户名、密码等信息进行系统登录&#xff0c;如图1所示。 图1管理员登录界面图 管理员登录进入母婴用品网站可以查看主页、个人中心、用户管理、商品分类管理、商品信息管理、留言板管理、成长交流、系统管理、订单管理、…

上手微服务框架go-zero

文章目录 微服务框架与web框架的区别点在哪儿&#xff1f;为什么还要有微服务框架微服务框架与web框架的对比小结 为什么选go-zero&#xff1f;框架对比 下载并认识go-zero认识go-zero环境要求组成下载 实践go-zero基础功能案例apirpc服务功能说明准备构建rpc服务构建api服务服…