设计模式builder的C++实现源码

1、产品类Product定义

#ifndef PRODUCT_H
#define PRODUCT_H

#define STR_COLOR " Color: "
#define STR_SPACE " Space: "
#define STR_OTHER " Other: "

class Product
{
public:
 Product();
 void buildColor(char* color);
 void buildSpace(int space);
 void buildOther(char* other);
 char* toString();
private:
 int first;
 char* color;
 int space;
 char* other;
 char* res;
};

#endif

 

2、产品类Product实现

#include <stdio.h>
#include <string.h>
#include "Product.h"

Product::Product()
{
 this->first = 0;
 this->res = NULL;
}

void Product::buildColor(char* col)
{
 if(first == 0)
 {
  first = 1;
 }
 this->color = col;
}

void Product::buildSpace(int space)
{
 if(first == 0)
 {
  first = 2;
 }
 this->space = space;
}

void Product::buildOther(char* other)
{
 this->other = other;
}

char* Product::toString()
{
 char strspace[3];
 sprintf(strspace,"%d",space);
 if(res != NULL)
 {
  delete res;
 }
 int len = strlen(STR_COLOR) + strlen(color);
 len += strlen(STR_SPACE) + strlen(strspace);
 len += strlen(STR_OTHER) + strlen(other);
 res = new char[len + 2];
 switch(first)
 {
 case 1:
  strcpy(res,STR_COLOR);
  strcat(res,color);
  strcat(res,STR_SPACE);
  strcat(res,strspace);
  strcat(res,STR_OTHER);
  strcat(res, other);
  strcat(res,"/n");
  break;
 case 2:
  strcpy(res,STR_SPACE);
  strcat(res,strspace);
  strcat(res,STR_COLOR);
  strcat(res,color);
  strcat(res,STR_OTHER);
  strcat(res, other);
  strcat(res,"/n");
  break;
 default:
  strcpy(res,STR_OTHER);
  strcat(res, other);
  strcat(res,STR_SPACE);
  strcat(res,strspace);
  strcat(res,STR_COLOR);
  strcat(res,color);
  strcat(res,"/n");
  break;
 }
 return res;
}

 

3、构造产品抽象类Builder定义

#ifndef BUILDER_H
#define BUILDER_H
#include "Product.h"

class Builder
{
public:
 virtual void CreatePartA(char* col, int spac) = 0;
 virtual void CreatePartB(char* col, int spac) = 0;
 virtual Product* GetProduct() = 0;
};

#endif

 

4、构造产品具体类ConcreteBuilder0定义

#ifndef CONCRETEBUILDER0_H
#define CONCRETEBUILDER0_H
#include "Builder.h"

class ConcreteBuilder0 : public Builder
{
public:
 ConcreteBuilder0();
 ~ConcreteBuilder0();
 void CreatePartA(char* col, int spac);
 void CreatePartB(char* col, int spac);
 Product* GetProduct();
private:
 Product* p;
};
#endif

 

5、构造产品具体类ConcreteBuilder0实现

#include <stdio.h>
#include <string.h>
#include "ConcreteBuilder0.h"

ConcreteBuilder0::ConcreteBuilder0()
{
 p = new Product();
}

ConcreteBuilder0::~ConcreteBuilder0()
{
 if(p != NULL)
 {
  delete p;
  p = NULL;
 }
}

void ConcreteBuilder0::CreatePartA(char* col, int spac)
{
 if(p == NULL)
 {
  return;
 }
 p->buildColor(col);
 p->buildSpace(spac);
}

void ConcreteBuilder0::CreatePartB(char* col, int spac)
{
 if(p == NULL)
 {
  return;
 }
 char stmp[3];
 sprintf(stmp,"%d",spac);
 int len = strlen(col) + strlen(" ") + strlen(stmp);
 char* tmp = new char[len];
 strcpy(tmp, col);
 strcat(tmp," ");
 strcat(tmp, stmp);
 p->buildOther(tmp);
}

Product* ConcreteBuilder0::GetProduct()
{
 return p;
}

 

6、构造产品具体类ConcreteBuilder1定义

#ifndef CONCRETEBUILDER1_H
#define CONCRETEBUILDER1_H
#include "Builder.h"

class ConcreteBuilder1 : public Builder
{
public:
 ConcreteBuilder1();
 ~ConcreteBuilder1();
 void CreatePartA(char* col, int spac);
 void CreatePartB(char* col, int spac);
 Product* GetProduct();
private:
 Product* p;
};
#endif

 

7、构造产品具体类ConcreteBuilder1实现

#include <stdio.h>
#include <string.h>
#include "ConcreteBuilder1.h"

ConcreteBuilder1::ConcreteBuilder1()
{
 p = new Product();
}

ConcreteBuilder1::~ConcreteBuilder1()
{
 if(p != NULL)
 {
  delete p;
  p = NULL;
 }
}

void ConcreteBuilder1::CreatePartA(char* col, int spac)
{
 if(p == NULL)
 {
  return;
 }
 p->buildSpace(spac);
 p->buildColor(col);
}

void ConcreteBuilder1::CreatePartB(char* col, int spac)
{
 if(p == NULL)
 {
  return;
 }
 char stmp[3];
 sprintf(stmp,"%d",spac);
 int len = strlen(col) + strlen(" ") + strlen(stmp);
 char* tmp = new char[len];
 strcpy(tmp, stmp);
 strcat(tmp," ");
 strcat(tmp, col);
 p->buildOther(tmp);
}

Product* ConcreteBuilder1::GetProduct()
{
 return p;
}

 

8、定义构造产品类的Director类定义

#ifndef DIRECTOR_H
#define DIRECTOR_H
#include "Builder.h"
class Director
{
public:
 void CreateProduct(Builder* b);
};

#endif

 

9、定义构造产品类的Director类实现

#include <stdio.h>
#include "Director.h"

void Director::CreateProduct(Builder* b)
{
 if(b == NULL)
 {
  return;
 }
 b->CreatePartA("Red",5);
 b->CreatePartB("Blue",12);
}

 

10、客户使用类Client实现

#include <stdio.h>
#include "Product.h"
#include "ConcreteBuilder0.h"
#include "Builder.h"
#include "Director.h"
#include "ConcreteBuilder1.h"

int main()
{
 Director* d = new Director();
 Builder* b = new ConcreteBuilder0();
 d->CreateProduct(b);
 Product* p = b->GetProduct();
 printf(p->toString());
 delete b;
 b = NULL;
 b = new ConcreteBuilder1();
 d->CreateProduct(b);
 p = b->GetProduct();
 printf(p->toString());
 delete b;
 b = NULL;
 delete d;
 d = NULL;
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++Builder精彩编程实例集锦的源代(1,2,3部分): 第一部分 界面设计 实例001 如何实现程序闪屏效果 实例002 如何实现程序窗口闪烁 实例003 如何制作吸附窗口程序 实例004 如何制作透明程序窗口 实例005 如何制作半透明程序窗口 实例006 如何制作不规则程序窗口 实例007 如何制作程序渐变背景 实例008 如何设置程序背景图像 实例009 如何设置MDI程序背景图像 实例010 如何动态关闭MDI程序所有子窗口 实例011 如何去掉MDI程序子窗口标题栏 实例012 如何拖动非标题栏区域移动窗口 实例013 如何控制程序最小化窗口 实例014 如何限制程序最大最小化窗口 实例015 如何控制程序窗口自动隐藏或显示 实例016 如何隐藏应用程序 实例017 如何控制程序在任务栏上是否出现 实例018 如何使一个程序在任务栏同时出现多个标题 实例019 如何使程序窗口总在最前面显示 实例020 如何隐藏应用程序标题栏 实例021 如何设置程序主标题 实例022 如何设置程序图标 实例023 如何在程序中改变菜单位置 实例024 如何删除程序系统关闭菜单 实例025 如何拷贝当前程序界面 实例026 如何动态创建程序表单 实例027 如何遍历窗体所有组件 实例028 如何保证组件位置相对固定 实例029 如何在窗体中动态增加组件 实例030 如何使组件在程序运行时可以移动 实例031 如何使用组件创建托盘程序 实例032 如何使用动画组件播放动画 实例033 如何在状态栏上加载进度条 实例034 如何在编辑框内显示图像 实例035 如何在列表框中增加水平滚动条 实例036 如何在列表框中同时显示图像和文字 实例037 如何设置属性表组件标签图像 实例038 如何控制Memo组件的文字边界 实例039 如何使用代控制文字滚动 实例040 如何纵向显示字符串 实例041 如何旋转显示字符串 实例042 如何设置显示文字分辨率 第二部分 程序设置 实例043 如何使用消息框 实例044 如何显示简单关于对话框 实例045 如何在程序中增加热键 实例046 如何在程序中自定义消息 实例047 如何在程序中自定义系统菜单 实例048 如何在执行程序间进行数据通信 实例049 如何使用OLE技术启动画图 实例050 如何在程序中添加Word文档表格 实例051 如何在程序中设置Word文档的字体风格 实例052 如何使用Onldle事件 实例053 如何使程序在循环时响应外界事件 实例054 如何设置程序在系统启动时自动运行 实例055 如何创建多线程程序 实例056 如何创建可独立执行程序 实例057 如何编写单文档应用程序 实例058 如何编写多文档应用程序 实例059 如何编写COM服务器程序 实例060 如何编写COM客户端程序 实例061 如何编写DDE服务器程序 实例062 如何编写DDE客户端程序 实例063 如何编写DLL服务器程序 实例064 如何编写DLL客户端程序 实例065 如何注册DLL服务器程序 实例066 如何制作聊天服务器程序 实例067 如何制作聊天客户端程序 实例068 如何获取程序名称和路径 实例069 如何获取程序命令行参数 实例070 如何析取动态链接库中的图标 实例071 如何设置Edit组件的文本选择范围 实例072 如何将小写金额转换成大写金额 实例073 如何将全角字符串转换成半角字符串 实例074 如何按照指定的有效位数转换数字 实例075 如何获取汉字的拼音索引 实例076 如何设置输入方法 实例077 如何控制数据输入格式 实例078 如何控制编辑框中的输入法 实例079 如何设置回车键后的焦点 实例080 如何将项目保存到对象库 实例081 如何检测鼠标信息 实例082 如何读取鼠标信息 实例083 如何实现鼠标拖动操作 实例084 如何限制鼠标活动范围 实例085 如何读取键盘信息 第三部分 文件操作 实例086 如何复制文件 实例087 如何定制文件复制操作 实例088 如何更名文件 实例089 如何更改文件扩展名 实例090 如何删除文件 实例091 如何删除文件夹 实例092 如何选择文件夹 实例093 如何创建多层文件夹 实例094 如何自动获取文件夹和文件 实例095 如何搜索指定目录下的文件 实例096 如何搜索指定目录下的隐藏文件 实例097 如何搜索文本文件中的字符串 实例098 如何替换文本文件中的字符串 实例099 如何将长文件名转换为短文件名 实例100 如何在文件打开对话框中选择多个文件 实例101 如何定制文件打开和关闭对话框 实例102 如何修改文件打开对话框的按钮标题 实例103 如何使用查找与替换对话框 实例104 如何获取和设置当前目录 实例105 如何判断文件类型 实例106 如何获取系统所有文件类型 实例107 如何获取和设置文件属性 实例108 如何获取和设置文件时间属性 实例109 如何对文件名函数进行操作 实例110 如何读写文本文件 实例111 如何打印文本文件 实例112 如何创建特大型文件 实例113 如何制作临时文件 实例114 如何启动帮助文件 实例115 如何使用组件在主机问传送文件 实例116 如何对文件进行编和解 实例117 如何设置RichEdit组件的存盘格式 实例118 如何在WIN.INI文件中保存程序信息 实例119 如何将数据转换成Word文档格式 实例120 如何直接从Excel文件导入数据 实例121 如何直接将数据导入到Excel文件 实例122 如何发送电子邮件(一) 实例123 如何发送电子邮件(二)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值