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_HPP
class 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 : XXProductB
class 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;
//产品AA
XXProductA *xaa = pfxa->CreateProductA();
//产品BA
XXProductB *xba = pfxa->CreateProductB();
//工厂XB生产以B结尾的不同产品
AbstractFactory *pfxb = new FactoryXB;
//产品AB
XXProductA *xab = pfxb->CreateProductA();
//产品BB
XXProductB *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_HPP
template< 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;
}