C++设计模式系列之一创建型模式
来源:互联网 发布:时时彩组三组六软件 编辑:程序博客网 时间:2024/06/03 16:51
1.简单工厂模式
Factory.hpp:
#ifndef _FACTORY_HPP_#define _FACTORY_HPP_#include <string>class Product{ public: virtual ~Product(){} protected: Product(){}};class XXProduct : public Product{public: XXProduct(){} ~XXProduct(){}};class XXXProduct : public Product{public: XXXProduct(){} ~XXXProduct(){}};class Factory{ public: Factory(){} ~Factory(){} Product* CreateXXProduct() { return new XXProduct(); } Product* CreateXXXProduct() { return new XXXProduct(); } //或者使用枚举 Product* CreateProduct( const char *pName ) { if( strstr( pName, "XXX" ) ) { return CreateXXXProduct(); } else if( strstr( pName, "XX") ) { return CreateXXProduct(); } else { return nullptr; } }};#endif
Main.cpp:
#include "Factory.hpp" //作用:隐藏对象创建的过程 //优点:结构简单,实现容易 //缺点:只能创建相同类型的对象,有多少个同类型对象就要实现相应的创建方法 int main() { //构造一个工厂 Factory *pf = new Factory; //隐藏创建细节,外部直接调用带参方法,或者直接调用相应的创建方法 Product *pxx = pf->CreateProduct( "XX" ); Product *pxxx = pf->CreateProduct( "XXX" ); delete pxx; delete pxxx; delete pf; return 0; }
2.抽象工厂模式
AbstractFactorty.hpp:
#ifndef _ABSTRACT_FACTORY_HPP#define _ABSTRACT_FACTORY_HPPclass XXProductA{public:XXProductA(){}virtual ~XXProductA(){}};class XXProductB{public:XXProductB(){}virtual ~XXProductB(){}};class XXProductAA : public XXProductA{public:XXProductAA(){}~XXProductAA(){}};class XXProductAB : public XXProductA{public:XXProductAB(){}~XXProductAB(){}};class XXProductBA : public XXProductB{public:XXProductBA(){}~XXProductBA(){}};class XXProductBB : public XXProductB{public:XXProductBB(){}~XXProductBB(){}};//继承关系//XXProductAA : XXProductA//XXProductAB : XXProductA//XXProductBA : XXProductB//XXProductBB : XXProductBclass AbstractFactory{public:virtual ~AbstractFactory(){}virtual XXProductA *CreateProductA() = 0;virtual XXProductB *CreateProductB() = 0;protected:AbstractFactory(){}};//每个工厂生产不同的产品class FactoryXA : public AbstractFactory{public:FactoryXA(){}virtual ~FactoryXA(){}virtual XXProductA *CreateProductA(){return new XXProductAA();}virtual XXProductB *CreateProductB(){return new XXProductBA();}};//每个工厂生产不同的产品class FactoryXB : public AbstractFactory{public:FactoryXB(){}virtual ~FactoryXB(){}virtual XXProductA *CreateProductA(){return new XXProductAB();}virtual XXProductB *CreateProductB(){return new XXProductBB();}};#endif
Main.cpp:
#include "AbstractFactory.hpp"//作用:根据不同类型的类,分为不同的创建工厂,是简单工厂模式的升级版//优点:根据产品的不同可以分为不同的工厂,可以创建不同的类型对象//缺点:多少个不同类型对象就要实现相应的创建方法int main(){//工厂XA生产以A结尾的不同产品AbstractFactory *pfxa = new FactoryXA;//产品AAXXProductA *xaa = pfxa->CreateProductA();//产品BAXXProductB *xba = pfxa->CreateProductB();//工厂XB生产以B结尾的不同产品AbstractFactory *pfxb = new FactoryXB;//产品ABXXProductA *xab = pfxb->CreateProductA();//产品BBXXProductB *xbb = pfxb->CreateProductB();delete xbb;delete xab;delete pfxb;delete xba;delete xaa;delete pfxa;return 0;}
3.Singleton模式
Singleton.cpp:
#ifndef _SINGLETON_HPP#define _SINGLETON_HPPtemplate< typename T >class Singleton{public:static T& GetInstance(){ //当然实现singleton模式的方法很多,这里只是简单实现 static T t; return t;}//关闭无用方法protected:Singleton(){}Singleton( const Singleton &other ){}Singleton& operator = ( const Singleton &other ){}virtual ~Singleton(){}};class MyXXXManager : public Singleton< MyXXXManager >{ friend class Singleton< MyXXXManager >; private: MyXXXManager(){} public: ~MyXXXManager(){} void DoSomeThing() {}};#endif
Main.cpp:
#include "Singleton.hpp"//作用:表示只能实例化一次类的对象int main(){auto &Instance = MyXXXManager::GetInstance();Instance.DoSomeThing();return 0;}
4.ProtoType模式
ProtoType.hpp:
#ifndef _PROTO_TYPE_HPP#define _PROTO_TYPE_HPP#include <memory>class ProtoType{public:virtual ~ProtoType(){}virtual ProtoType* Clone() = 0;protected:ProtoType(){}};class XXProtoType : public ProtoType{public:XXProtoType(){mdata = 0;memset( mname, 0, sizeof( mname ) );mp = new char[ 128 ];}XXProtoType( const XXProtoType &other ){mdata = other.mdata;strcpy( mname, other.mname );mp = new char[ 128 ];memcpy( mp, other.mp, 128 );}virtual ~XXProtoType(){delete [] mp;mp = nullptr;}virtual ProtoType* Clone(){//注意拷贝构造要深度拷贝return new XXProtoType( *this );}private:int mdata;char mname[ 32 ];char *mp;};#endif
Main.cpp:
#include "ProtoType.hpp"//作用:当需要对某个对象创建相同数据的或有细微差别对象时,调用克隆方法即可,如果存在细微差别的地方通过克隆对象对外的方法调整即可int main(){//创建自己ProtoType *p = new XXProtoType;//克隆自己ProtoType *pClone = p->Clone();delete pClone;delete p;return 0;}
5.Builder模式
Builder.hpp:
#ifndef _BULIDER_HPP#define _BUILDER_HPP#include <stdio.h>#include <memory>typedef unsigned int u32;typedef unsigned char u8;typedef char c8;//PCB板层数enum ePcbType{ ePT_8 = 8, ePT_10 = 10, ePT_11 = 11,};//GPU类型enum eGpuType{ eGT_GEFORCE_GTX_1080 = 1080, eGT_GEFORCE_GTX_1070 = 1070, eGT_GEFORCE_GTX_1060 = 1060,};//GPU频率enum eGpuHz{ eGH_800_MHZ = 800, eGH_900_MHZ = 900, eGH_1_GHZ = 1000,};//显存颗粒类型enum eMemoryType{ eMT_GDDR3, eMT_GDDR5, eMT_GDDR5X,};//显存颗粒位宽enum eMemoryBusWidth{ eMBW_16BIT = 1 << 4, eMBW_32BIT = 1 << 5, eMBW_64BIT = 1 << 6,};//显存频率enum eMemoryHz{ eMH_5000_MHZ = 5000, eMH_7000_MHZ = 7000, eMH_10_GHZ = 10000,};//显存颗粒enum eMemorySize{ eMS_64_MB = 1 << 6, eMS_128_MB = 1 << 7, eMS_256_MB = 1 << 8, eMS_512_MB = 1 << 9, eMS_1024_MB = 1 << 10,};//电源类型enum ePowerType{ ePWT_4PIN = 1, ePWT_6PIN, ePWT_8PIN,};//模拟显卡生产class GraphicsCard{public: GraphicsCard() { memset( this, 0, sizeof( *this ) ); } void Print() { const c8 *MemoryTypes[] = { "GDDR3", "GDDR5", "GDDR5X" }; const c8 *PowerTypes[] = { "4PIN", "4PIN", "6PIN", "6PIN", "8PIN", "8PIN" }; c8 PowerType[ 32 ] = {}; for( c8 i = 0; i < sizeof( mPowerType ); ++i ) { if( mPowerType[ i ] ) { strcat( PowerType, PowerTypes[ i ] ); strcat( PowerType, " " ); } } c8 gpu_info[ 512 ] = {}; sprintf( gpu_info, "显卡名称:Geforce GTX %u\n" "核心频率:%uMhz\n" "PCB层数:%u层\n" "显存类型:%s\n" "显存频率:%uMhz\n" "显存位宽:%ubit\n" "显存容量:%uMB\n" "电源接口:%s\n", mGpuType, mGpuHz, mPcbType, MemoryTypes[ mMemroyType ], mMemoryHz, mMemoryBushWidth, mMemorySize, PowerType ); printf( "%s\n", gpu_info ); } ePcbType mPcbType; eGpuType mGpuType; eGpuHz mGpuHz; eMemoryType mMemroyType; u32 mMemoryBushWidth; eMemoryHz mMemoryHz; u32 mMemorySize; u8 mPowerType[ 6 ];};//生产显卡流水线class Builder{public: Builder(){} virtual ~Builder(){} virtual void SetUpPcb( ePcbType type ) = 0; //生产pcb板 virtual void SetUpGpu( eGpuType type, eGpuHz hz ) = 0; //安装gpu核心 virtual void SetUpMemory( eMemoryType type, //显存颗粒类型 eMemorySize size, //显存颗粒容量 eMemoryHz hz, //出厂设置频率 eMemoryBusWidth buswidth, //显存颗粒位宽 u8 count //安装显存颗粒数量 ) = 0; //安装显存颗粒 virtual void SetUpPower( ePowerType type ) = 0; //安装电源接口 virtual GraphicsCard* GetGraphicsCard() = 0; //得到安装完毕的显卡};class GraphicsBuilder : public Builder{ public: GraphicsBuilder() {} ~GraphicsBuilder() {} void SetUpPcb( ePcbType type ) //生产pcb电子板 { mpGraphicsCard = new GraphicsCard; //从开始生产pcb板开始认为是新的一块显卡,注意流程先有pcb才有下面的操作 mpGraphicsCard->mPcbType = type; } void SetUpGpu( eGpuType type, eGpuHz hz ) //安装内核 { mpGraphicsCard->mGpuType = type; mpGraphicsCard->mGpuHz = hz; } //安装显存颗粒 void SetUpMemory( eMemoryType type, eMemorySize size, eMemoryHz hz, eMemoryBusWidth buswidth, u8 count ) { mpGraphicsCard->mMemroyType = type; mpGraphicsCard->mMemoryHz = hz; mpGraphicsCard->mMemorySize = count * size; mpGraphicsCard->mMemoryBushWidth = count * buswidth; } //安装电源接口 void SetUpPower( ePowerType type ) { switch( type ) { case ePWT_4PIN: { if( mpGraphicsCard->mPowerType[ 0 ] ) { mpGraphicsCard->mPowerType[ 1 ] = type; } else { mpGraphicsCard->mPowerType[ 0 ] = type; } } break; case ePWT_6PIN: { if( mpGraphicsCard->mPowerType[ 2 ] ) { mpGraphicsCard->mPowerType[ 3 ] = type; } else { mpGraphicsCard->mPowerType[ 2 ] = type; } } break; default: { if( mpGraphicsCard->mPowerType[ 4 ] ) { mpGraphicsCard->mPowerType[ 5 ] = type; } else { mpGraphicsCard->mPowerType[ 4 ] = type; } } break; } } GraphicsCard* GetGraphicsCard() { return mpGraphicsCard; } private: GraphicsCard *mpGraphicsCard;};//设计师或者是工程师class GTX1080Engineer{public: GTX1080Engineer() {} GraphicsCard* SetUpGTX1080( Builder *p ) //GTX1080性能最好 { p->SetUpPcb( ePT_11 ); p->SetUpGpu( eGT_GEFORCE_GTX_1080, eGH_1_GHZ ); p->SetUpMemory( eMT_GDDR5X, eMS_1024_MB, eMH_10_GHZ, eMBW_32BIT, 8 ); p->SetUpPower( ePWT_8PIN ); p->SetUpPower( ePWT_8PIN ); return p->GetGraphicsCard(); }};class GTX1070Engineer{public: GTX1070Engineer() {} GraphicsCard* SetUpGTX1070( Builder *p ) //GTX1070性能次之 { p->SetUpPcb( ePT_10 ); p->SetUpGpu( eGT_GEFORCE_GTX_1070, eGH_900_MHZ ); p->SetUpMemory( eMT_GDDR5, eMS_512_MB, eMH_7000_MHZ, eMBW_32BIT, 8 ); p->SetUpPower( ePWT_6PIN ); p->SetUpPower( ePWT_8PIN ); return p->GetGraphicsCard(); }};class GTX1060Engineer{public: GTX1060Engineer() {} GraphicsCard* SetUpGTX1060( Builder *p ) //GTX1060性能主流 { p->SetUpPcb( ePT_8 ); p->SetUpGpu( eGT_GEFORCE_GTX_1060, eGH_800_MHZ ); p->SetUpMemory( eMT_GDDR3, eMS_256_MB, eMH_5000_MHZ, eMBW_16BIT, 8 ); p->SetUpPower( ePWT_8PIN ); return p->GetGraphicsCard(); }};#endif
Main.cpp:
#include "Builder.hpp"//作用:将类的创建和数据加工进行封装我们称之为Builder设计模式( C#中的StringBuilder类为典型例子 )//应用:地图编辑器、场景编辑器、UI编辑器( 个人理解,你自己想想是不是这样 )//网上很多都是原话照搬,我觉得这些所谓的设计模式,要理解思想,扩展思想,将理论转换为实用和现实//根本不可能原封不动的搬过来照用,很多人不明白为何要这样用,因为你还没//有真正的理解这个模式,真正理解这个模式了,你就能在原有基础上,加入//你自己的思想,用到你的项目中去,我们面对的是项目都是多种多样的,不可能//100%的在网络上找到满足你自己的解决方案//我认为Builder模式即:创建者模式,只要满足,创建对象并且在创建后对该对象//数据加工进行封装即可即:XXXBuilder类封装创建和数据加工,需要创建和加工的类//有这两个类就算是基本的Builer模式了//我写的例子中的GTXxxxxEngineer可以省略不用,指导者,可以是类,也可以是客户程序员//C#中的StringBuilder对字符串加工,最后返回加工后的字符串,他的指导者就是使用者或客户程序员//下面我们通过显卡的生产来理解这个模式int main(){ //显卡生产流水线 Builder *pBuilder = new GraphicsBuilder; //GTX1060显卡工程师或者设计师 GTX1060Engineer *pGTX1060Engineer = new GTX1060Engineer; //GTX1070显卡工程师或者设计师 GTX1070Engineer *pGTX1070Engineer = new GTX1070Engineer; //GTX1080显卡工程师或者设计师 GTX1080Engineer *pGTX1080Engineer = new GTX1080Engineer; //控制显卡流水线生产GTX1060显卡 GraphicsCard *pGTX1060 = pGTX1060Engineer->SetUpGTX1060( pBuilder ); //控制显卡流水线生产GTX1070显卡 GraphicsCard *pGTX1070 = pGTX1070Engineer->SetUpGTX1070( pBuilder ); //控制显卡流水线生产GTX1080显卡 GraphicsCard *pGTX1080 = pGTX1080Engineer->SetUpGTX1080( pBuilder ); //通过不同的显卡工程师或者设计师,我们创造了三款不同的显卡产品 pGTX1060->Print(); pGTX1070->Print(); pGTX1080->Print(); delete pGTX1060; delete pGTX1070; delete pGTX1080; delete pGTX1060Engineer; delete pGTX1070Engineer; delete pGTX1080Engineer; delete pBuilder; return 0;}
0 0
- C++设计模式系列之一创建型模式
- 创建型模式-- 设计模式学习之一
- 设计模式系列之一:简单工厂模式
- 设计模式系列之一单例模式
- 设计模式系列之一:单例模式
- 【C#】设计模式-创建型模式
- 设计模式笔记--创建型模式之一 抽象工厂
- 设计模式系列之一:写在系列前面
- 设计模式详细系列教程 (二) 创建型模式
- 设计模式学习笔记之一(创建模式---工厂模式)
- 23种设计模式之一(创建型模式)Factory模式
- 23种设计模式之一(创建型模式)Factory模式
- 创建型模式之一---AbstractFactory
- Python设计模式系列之一: 用模式改善软件设计
- java设计模式学习系列之一:单例模式(Singleton)
- Python设计模式系列之一: 用模式改善软件设计
- java设计模式学习系列之一:单例模式(Singleton)
- 软件设计模式系列之一 什么是设计模式(一)
- 高效率地显示位图(总课程绪论)Display Bitmaps Efficiently——翻译自developer.android.com Training
- java 成神之路 (三)
- Windows监控——性能指标详解
- fb直接渲染
- [Docker]核心概念
- C++设计模式系列之一创建型模式
- Java 中的包装类
- 深入理解nginx chap3 开发一个简单的HTTP模块
- 基于用户的协同过滤和基于物品的协同过滤推荐算法原理和实现
- JS点击标题自动排序
- App的URL跳转到手机浏览器(openSafari)
- 环形进度条
- UIWindows小知识点
- 如何配置pom.xml用maven打包java工程