设计模式之创建者模式
来源:互联网 发布:华为喵王软件 编辑:程序博客网 时间:2024/04/30 21:59
生成器(创建者)模式和工厂模式都属于创建型设计模式。
前一篇文章简述了简单工厂,工厂方法和抽象工厂的差异。那么生成器模式和工厂模式有什么区别呢。
总结下:M为工厂类数,N为产品类数
工厂模式 比例关系为 1:N/M
简单工厂 M=1(无论多少种产品只有一种工厂)
工厂方法 是 M=N(多少种产品就有多少种工厂)
而抽象工厂是 抽象类别 = N/M (在两个产品层级关系下)
而本文所说的生成器模式,则是在一种产品的前提下讨论的。生成器其实不是产生对象,用确切点的话来说可以看成是构造对象,是一个过程。
代码:
/** * @author nhpeng,nhpeng1104@gmail.com * @date 2015/08/18 10:08:56 CST * @brief 建造者模式 * * */#include <stdio.h>#include <string>class Battle{ public: Battle( ){}; ~Battle( ){}; void SetPartA( std::string partA ){ m_partA = partA; }; void SetPartB( std::string partB ){ m_partB = partB; }; void SetPartC( std::string partC ){ m_partC = partC; }; void SetPartD( std::string partD ){ m_partD = partD; }; void Show( ) { printf( "%s - %s - %s - %s\n", m_partA.c_str( ), m_partB.c_str( ), m_partC.c_str( ), m_partD.c_str( ) ); }; private: std::string m_partA; std::string m_partB; std::string m_partC; std::string m_partD;};class Builder{ public: Builder( Battle *battle ); virtual ~Builder( ){}; virtual void CreateBattle( ){}; protected: Battle *m_battle;};Builder::Builder( Battle *battle ){ m_battle = battle;}class BuilderA : public Builder{ public: BuilderA( Battle *battle ); virtual ~BuilderA( ){}; virtual void CreateBattle( );};BuilderA::BuilderA( Battle *battle ):Builder( battle ){}void BuilderA::CreateBattle( ){ m_battle->SetPartA( "BuilderA PartA" ); m_battle->SetPartB( "BuilderA PartB" ); m_battle->SetPartC( "BuilderA PartC" ); m_battle->SetPartD( "BuilderA PartD" );}class BuilderB : public Builder{ public: BuilderB( Battle *battle ); virtual ~BuilderB( ){}; virtual void CreateBattle( );};BuilderB::BuilderB( Battle *battle ):Builder( battle ){}void BuilderB::CreateBattle( ){ m_battle->SetPartA( "BuilderB PartA" ); m_battle->SetPartB( "BuilderB PartB" ); m_battle->SetPartC( "BuilderB PartC" ); m_battle->SetPartD( "BuilderB PartD" );}int main( ){ Battle *battle1 = new Battle( ); BuilderA builderA( battle1 ); builderA.CreateBattle( ); battle1->Show( ); delete battle1; Battle *battle2 = new Battle( ); BuilderB builderB( battle2 ); builderB.CreateBattle( ); battle2->Show( ); delete battle2; return 0;}
自己写一遍就能够理解我上面总结出来的话了。battle1和battle2都不是BuilderA和BuilderB生成的,
他们只是再次构造了一下这两个对象。
两个生成器BuilderA,BuilderB,顺序相同(其实貌似顺序也可以不同的),材料不同(BuilderA PartA,BuilderB PartA),个人觉得构造者模式这个名字挺贴切;
0 0
- 设计模式之创建者模式
- 设计模式之创建者模式
- 设计模式之创建者模式
- 设计模式之创建者模式
- 设计模式之创建者模式
- 设计模式之创建者模式
- 设计模式之创建者模式
- 设计模式之创建者模式
- 设计模式之创建者模式
- JAVA设计模式之创建者模式
- c++ 设计模式之创建者(生成器)模式
- java 设计模式之八-创建者模式
- 设计模式之创建者模式 c++ 实现
- 设计模式之创建者模式(Builder)
- java设计模式 之 创建者模式
- c++ 设计模式之创建者(生成器)模式
- Swift设计模式之创建者模式
- JAVA设计模式之创建者模式
- 常用字符串的截取
- 四种不同的NAT类型
- 本人参与的项目
- 用其他用户的身份执行命令:sudo
- mt7620 openwrt编译,修改dts文件
- 设计模式之创建者模式
- 社説 20150818 新国立競技場 「選手第一」の視点を忘れずに
- 函数调用堆栈图
- Uri详解之——Uri结构与代码提取
- shell初级编程问题(一):fi关键字显示红色,运行报语法错误
- Maven 使用指南(2): 第一个例子Hello World
- Hadoop hdfs 介绍 一
- 社説 20150818 GDPマイナス 景気の停滞を長引かせるな
- Charles抓Https