文章目录

  • 前言
  • 一、创建型模式
    • 1.Factory模式
      • 功能
      • 图示
      • 实现
      • 结果
    • 2. AbstractFactory模式
      • 功能
      • 图示
      • 实现
      • 结果
    • 3. Singleton模式
      • 功能
      • 图示
      • 实现
      • 结果
    • 4. Builder模式
      • 功能
      • 图示
      • 实现
      • 结果
    • 5.Prototype模式
      • 功能
      • 图示
      • 实现
      • 结果
  • tips

前言

23个设计模式总结整理——创建型模式(5个)


一、创建型模式

1.Factory模式

功能

  1. 定义创建对象的接口,封装了对象的创建;让子类决定实例化哪一个类;
  2. 使得具体化类的工作延迟到了子类中

图示

实现

//Product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_class Product {public:virtual ~Product() = 0;
protected:Product(); //屏蔽构造函数
};class ConcreteProduct:public Product {public:~ConcreteProduct();ConcreteProduct();
private:
protected:};#endif
//Product.cpp
#include "Product.h"
#include<iostream>
using namespace std;Product::Product() {}Product::~Product() {}ConcreteProduct::ConcreteProduct() {cout << "ConcreteProduct..." << endl;
}ConcreteProduct::~ConcreteProduct() {}
//Factory.h
#ifndef _FACTORY_H_
#define _FACTORY_H_class Product;class Factory {public:virtual ~Factory() = 0;virtual Product* CreateProduct() = 0;
protected:Factory();
private:};class ConcreteFactory :public Factory {public:~ConcreteFactory();ConcreteFactory();Product* CreateProduct();
protected:
private:};#endif
//Factory.cpp
#include "Factory.h"
#include "Product.h"
#include<iostream>
using namespace std;Factory::Factory() {}Factory::~Factory() {}ConcreteFactory::ConcreteFactory() {cout << "ConcreteFactory..." << endl;
}ConcreteFactory::~ConcreteFactory() {}Product* ConcreteFactory::CreateProduct() {return new ConcreteProduct();
}
//main.cpp
#include "Factory.h"
#include "Product.h"
#include<iostream>
using namespace std;int main() {Factory* fac = new ConcreteFactory();Product* p = fac->CreateProduct();return 0;
}

结果

2. AbstractFactory模式

功能

创建一组相关或者相互依赖的对象,如游戏中,在每个关卡,要创建怪物实例,初级就创建初级怪物(有很多种类),中级创建中级怪物等。

图示

实现

//Procduct.h
#ifndef _PRODUCT_H_
#define _PRODUCT__H_class AbstractProductA {public:virtual ~AbstractProductA();
protected:AbstractProductA();
private:
};class AbstractProductB {public:virtual ~AbstractProductB();
protected:AbstractProductB();
private:
};class ProductA1 :public AbstractProductA {public:ProductA1();~ProductA1();
protected:
private:
};class ProductA2 :public AbstractProductA {public:ProductA2();~ProductA2();
protected:
private:
};class ProductB1 :public AbstractProductB {public:ProductB1();~ProductB1();
protected:
private:
};class ProductB2 :public AbstractProductB {public:ProductB2();~ProductB2();
protected:
private:
};#endif
//Product.cpp
#include "Product.h"
#include<iostream>
using namespace std;AbstractProductA::AbstractProductA() {}AbstractProductA::~AbstractProductA() {}AbstractProductB::AbstractProductB() {}AbstractProductB::~AbstractProductB() {}ProductA1::ProductA1() {cout << "ProductA1..." << endl;
}ProductA1::~ProductA1() {}ProductA2::ProductA2() {cout << "ProductA2..." << endl;
}ProductA2::~ProductA2() {}ProductB1::ProductB1() {cout << "ProductB1..." << endl;
}ProductB1::~ProductB1() {}ProductB2::ProductB2() {cout << "ProductB2..." << endl;
}ProductB2::~ProductB2() {}
//AbstractFactory.h
#ifndef _ABSTRACTFACTORY_H_
#define _ABSTRACTFACTORY_H_class AbstractProductA;
class AbstractProductB;class AbstractFactory {public:virtual ~AbstractFactory();virtual AbstractProductA* CreateProductA() = 0;virtual AbstractProductB* CreateProductB() = 0;
protected:AbstractFactory();
private:
};class ConcreteFactory1 :public AbstractFactory {public:ConcreteFactory1();~ConcreteFactory1();AbstractProductA* CreateProductA();AbstractProductB* CreateProductB();
protected:
private:
};class ConcreteFactory2 :public AbstractFactory {public:ConcreteFactory2();~ConcreteFactory2();AbstractProductA* CreateProductA();AbstractProductB* CreateProductB();
protected:
private:
};#endif
//AbstractFactory.cpp
#include "AbstractFactory.h"
#include "Product.h"
#include<iostream>
using namespace std;AbstractFactory::AbstractFactory() {}AbstractFactory::~AbstractFactory() {}ConcreteFactory1::ConcreteFactory1() {}ConcreteFactory1::~ConcreteFactory1() {}AbstractProductA* ConcreteFactory1::CreateProductA() {return new ProductA1();
}AbstractProductB* ConcreteFactory1::CreateProductB() {return new ProductB1();
}ConcreteFactory2::ConcreteFactory2() {}ConcreteFactory2::~ConcreteFactory2() {}AbstractProductA* ConcreteFactory2::CreateProductA() {return new ProductA2();
}AbstractProductB* ConcreteFactory2::CreateProductB() {return new ProductB2();
}
//main.cpp
#include "AbstractFactory.h"
#include<iostream>
using namespace std;int main(int argc, char* argv[]) {AbstractFactory* cf1 = new ConcreteFactory1();cf1->CreateProductA();cf1->CreateProductB();AbstractFactory* cf2 = new ConcreteFactory2();cf2->CreateProductA();cf2->CreateProductB();return 0;
}

结果

3. Singleton模式

功能

保证只能创建一个对象

图示

实现

//Singleton.h
#ifndef _SINGLKETON_H_
#define _SINGLETON_H_
#include<iostream>
using namespace std;class Singleton {public:static Singleton* Instance();
protected:Singleton();
private:static Singleton* _instance;
};#endif
//Singleton.cpp
#include "Singleton.h"
#include<iostream>
using namespace std;Singleton* Singleton::_instance = 0;Singleton::Singleton() {cout << "Singleton..." << endl;
}Singleton* Singleton::Instance() {if (_instance == 0) {_instance = new Singleton();}return _instance;
}
//main.cpp
#include"Singleton.h"
#include<iostream>
using namespace std;int main(int argc, char* argv[]) {Singleton* sgn = Singleton::Instance();return 0;
}

结果

4. Builder模式

功能

当我们要创建的对象很复杂是(通常由很多其他的对象组合而成),要把复杂对象的创建过程与这个对象的表示分离开来,这样做的好处是,通过一步步地进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样
例如,大学生活就是一个Builder模式的最好体验:要完成大学教育,一般将大学教育过程分成4个学期进行,因此每一学期可以看做是构建完整大学教育的一个部分教育过程,每个人经过这4年的构建过程得到最后的结果不一样,因为可能在四个阶段的构建中引入了很多的参数。(每个人的机会际遇不完全相同)

图示

实现

//Product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_class Product {public:Product();~Product();void ProducePart();
protected:
private:
};class ProductPart {public:ProductPart();~ProductPart();ProductPart* BuildPart();
protected:
private:
};
#endif
//Product.cpp
#include "Product.h"
#include<iostream>
using namespace std;Product::Product() {ProducePart();cout << "return a product" << endl;
}Product::~Product() {}void Product::ProducePart() {cout << "build a part of product.." << endl;
}
ProductPart::ProductPart() {cout << "build product part" << endl;
}ProductPart::~ProductPart() {}ProductPart* ProductPart::BuildPart() {return new ProductPart;
}
//Builder.h
#ifndef _BUILIDER_H_
#define _BUILDER_H_
#include<iostream>
using namespace std;class Product;class Builder {public:virtual ~Builder();virtual void BuildPartA(const string& buildPara) = 0;virtual void BuildPartB(const string& buildPara) = 0;virtual void BuildPartC(const string& buildPara) = 0;virtual Product* GetProduct() = 0;
protected:Builder();
private:
};class ConcreteBuilder :public Builder {public:ConcreteBuilder();~ConcreteBuilder();void BuildPartA(const string& buildPara);void BuildPartB(const string& buildPara);void BuildPartC(const string& buildPara);Product* GetProduct();
protected:
private:
};#endif
//Builder.cpp
#include "Builder.h"
#include "Product.h"
#include<iostream>
using namespace std;Builder::Builder() {}Builder::~Builder() {}ConcreteBuilder::ConcreteBuilder() {}ConcreteBuilder::~ConcreteBuilder() {}void ConcreteBuilder::BuildPartA(const string& buildPara) {cout << "Step1:Bild PartA..." << buildPara << endl;
}void ConcreteBuilder::BuildPartB(const string& buildPara) {cout << "Step2:Build PartB..." << endl;
}void ConcreteBuilder::BuildPartC(const string& buildPara) {cout << "Step3:Build PartC..." << endl;
}Product* ConcreteBuilder::GetProduct() {BuildPartA("pre-defined");BuildPartB("pre-defined");BuildPartC("pre-defined");return new Product();
}
//Director.h
#ifndef _DIRECTOR_H_
#define _DIRECTOR_H_class Builder;class Director {public:Director(Builder* bld);~Director();void Condtruct();
protected:
private:Builder* _bld;
};#endif
//Director.cpp
#include "Director.h"
#include "Builder.h"Director::Director(Builder* bld) {_bld = bld;
}Director::~Director() {}void Director::Condtruct() {_bld->BuildPartA("user-defined");_bld->BuildPartB("user-defined");_bld->BuildPartC("user-defined");
}
//main.cpp
#include "Builder.h"
#include "Director.h"
#include "Product.h"
#include<iostream>
using namespace std;int main(int argc, char* argv[]) {Director* d = new Director(new ConcreteBuilder());d->Condtruct();return 0;
}

结果

5.Prototype模式

功能

通过已有对象创建新对象,即复制

图示

实现

//Prototype.h
#ifndef _PROTOTYPE_H_
#define _PROTOTYPE_H_class Prototype {public:virtual ~Prototype();virtual Prototype* Clone() const = 0;
protected:Prototype();
private:
};class ConcretePrototype :public Prototype {public:ConcretePrototype();ConcretePrototype(const ConcretePrototype& cp);~ConcretePrototype();Prototype* Clone() const;
protected:
private:
};#endif
//Prototype.cpp
#include "Prototype.h"
#include<iostream>
using namespace std;Prototype::Prototype() {}Prototype::~Prototype() {}Prototype* Prototype::Clone() const {return 0;
}ConcretePrototype::ConcretePrototype() {}ConcretePrototype::~ConcretePrototype() {}ConcretePrototype::ConcretePrototype(const ConcretePrototype& cp) {cout << "ConcretePrototype copy..." << endl;
}Prototype* ConcretePrototype::Clone() const {return new ConcretePrototype(*this);
}
//main.cpp
#include "Prototype.h"
#include<iostream>
using namespace std;int main(int argc, char* argv[]) {Prototype* p = new ConcretePrototype();Prototype* p1 = p->Clone();return 0;
}

结果


tips

next:结构型模式

常用设计模式C++实现(一)相关推荐

  1. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  2. 打死都要记住!微服务架构的常用设计模式!

    作者:duanxz 来源:cnblogs.com/duanxz/p/3514895.html 大家好,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许我休息一下哈).今天跟大家分享微服务架 ...

  3. 原型模式的应用场景_前端常用设计模式

    求关注 前端常见的设计模式主要有以下几种:1. 单例模式2. 工厂模式3. 策略模式4. 代理模式5. 观察者模式6. 模块模式7. 构造函数模式8. 混合模式 单例模式 这种设计模式的思想是确保一个 ...

  4. Java常用设计模式————原型模式(一)

    介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...

  5. 模板设计模式_C常用设计模式——模板方法模式

    C常用设计模式系列,我们是以策略模式开头的,因为它太简单太实用了,本篇讲的模板方法模式(Template Method),同样简单又实用.模板方法模式堪称局部代码分离关注点的神器. 代码里有个流程A, ...

  6. 23种常用设计模式的UML类图

    23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源码)与<设计模式:可复用面向对象软件的基础>(源码)两书中介绍的设计模式与UML图. 整 ...

  7. Spring常用设计模式--简单工厂模式

    本专栏内容参考自:咕泡学院Tom老师的<Spring5核心原理与30个类手写实战>,仅作个人学习记录使用,如有侵权,联系速删. 工厂模式的由来:   在现实生活中我们都知道,原始社会自给自 ...

  8. 初学Java常用设计模式之——原型模式

    声明:转载请附上原文链接 提示:标题序号从3开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--工厂模式 序号从2开始. 标题后面之所以加上了解,是因为相对 ...

  9. java常用设计模式文章收集

    java常用设计模式文章收集 java设计模式--接口模式 java设计模式--抽象工厂模式 java设计模式--工厂模式 Java设计模式--迭代器模式 Java设计模式--原型模式 JAVA设计模 ...

  10. 九大常用设计模式学习-装饰者模式

    设计模式学习记录:一句话+代码体会设计模式. 九大常用设计模式 单例模式:https://blog.csdn.net/qq_37902949/article/details/87903569 简单工厂 ...

最新文章

  1. DIV布局SEO的影响
  2. 【开源】一键生成各种姿势的火柴人gif:在线录制真人视频即可转换
  3. SAP RETAIL 初阶之使用事务代码WRFMATCOPY创建商品主数据
  4. 动态线条,随鼠标移动吸附效果
  5. solr学习之(七)_学习solr的理由(solr的特点和应用领域)
  6. 从零开始的51单片机——(1)点亮LED
  7. rocksdb和leveldb的bloom filter比较
  8. 【李超树】李超线段树维护凸包(凸壳) (例题:blue mary开公司+线段游戏+ZZH的旅行)
  9. 学python编脚本_python 学习写脚本
  10. unicode学习笔记
  11. matlab色差,计算CMC色差公式的matlab程序
  12. 数据库系统概念读书笔记-SQL标准简介
  13. 《麦肯锡方法》读书笔记21
  14. 狼人杀微信娱乐游戏小程序源码
  15. 二元函数对xy同时求导_呆哥数学每日一题 ——求多元函数最小值
  16. 图机器学习——1.1 传统方法:基于节点
  17. Setycyas的自定义表情油猴插件
  18. Unity3D 显示FPS
  19. Ensemble查看基因的外显子信息,并根据染色体位点判断是第几号外显子
  20. 互联网晚报 | 9月10日 星期五 | 美团启动数字人民币低碳出行试点;vivo X70系列正式发布;旷视科技科创板IPO过会...

热门文章

  1. ChatGPT结合知识图谱构建医疗问答应用 (一) - 构建知识图谱
  2. js 的冒泡和捕获事件
  3. 台式电脑通过手机上网 win7 android
  4. python深圳培训机构哪里好
  5. 【Cetus 介绍】
  6. 建安市option3X“JAB1-JAB3”与“JAC1-JAC3”联合通信
  7. windows基线检测
  8. java 8 stream流求交集并集和差集
  9. Ubuntu 16.04安装 微信
  10. 通用定时器输入捕获实验