Builder
1.意图
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.Builder模式的核心是聚合
Director负责指挥,知道要做什么,Builder负责实施,负责做出来.
Builder接口中封装如何创建一个个部件,Director的将部件组装成成品.
2.代码
#include<iostream>
usingnamespacestd;
//product
classCFrame
{
public:
virtualvoiddraw()=0;
};
//一横
classCOneAcross:publicCFrame
{
public:
virtualvoiddraw()
{
cout<<"drawoneacrossline!"<<endl;
}
};
//两横
classCTwoAcross:publicCFrame
{
public:
virtualvoiddraw()
{
cout<<"drawtwoacrossline!"<<endl;
}
};
//三横
classCThreeAcross:publicCFrame
{
public:
virtualvoiddraw()
{
cout<<"drawthreeacrossline!"<<endl;
}
};
//一竖
classCOneVertical:publicCFrame
{
public:
virtualvoiddraw()
{
cout<<"drawoneverticalline!"<<endl;
}
};
//两竖
classCTwoVertical:publicCFrame
{
public:
virtualvoiddraw()
{
cout<<"drawtwoverticalline!"<<endl;
}
};
//三竖
classCThreeVertical:publicCFrame
{
public:
virtualvoiddraw()
{
cout<<"drawthreeverticalline!"<<endl;
}
};
//一点
classCOneDot:publicCFrame
{
public:
virtualvoiddraw()
{
cout<<"drawonedot!"<<endl;
}
};
//字符结构
classCCharacter:publicCFrame
{
public:
#defineFRAME_MAX_NUM10
CCharacter()
{
m_frameNum=0;
}
virtualvoidAddFrame(CFrame*frame)
{
if(m_frameNum<FRAME_MAX_NUM)
{
m_frame[m_frameNum]=frame;
m_frameNum++;
}
}
virtualvoiddraw()
{
cout<<"drawcharacter!"<<endl;
for(inti=0;i<m_frameNum;i++)
{
m_frame[i]->draw();
}
}
CFrame*m_frame[FRAME_MAX_NUM];
intm_frameNum;
};
//builder创建部件
classCCharacterBuilder
{
protected:
CCharacterBuilder(){}
public:
virtualvoidBuilderAcross(){}
virtualvoidBuilderDot(){}
virtualvoidBuilderVertical(){}
virtualCCharacter*GetCharacter(){returnNULL;}
};
//王
classCCharacterOneBuilder:publicCCharacterBuilder
{
public:
CCharacterOneBuilder()
{
m_pCharacter=newCCharacter();
}
virtualvoidBuilderAcross()
{
CFrame*cross=newCThreeAcross();
m_pCharacter->AddFrame(cross);
}
virtualvoidBuilderVertical()
{
CFrame*vertical=newCOneVertical();
m_pCharacter->AddFrame(vertical);
}
virtualvoidBuilderDot()
{
}
virtualCCharacter*GetCharacter()
{
returnm_pCharacter;
}
private:
CCharacter*m_pCharacter;
};
//玉
classCCharacterTwoBuilder:publicCCharacterBuilder
{
public:
CCharacterTwoBuilder()
{
m_pCharacter=newCCharacter();
}
virtualvoidBuilderAcross()
{
CThreeAcross*cross=newCThreeAcross();
m_pCharacter->AddFrame(cross);
}
virtualvoidBuilderVertical()
{
COneVertical*vertical=newCOneVertical();
m_pCharacter->AddFrame(vertical);
}
virtualvoidBuilderDot()
{
COneDot*dot=newCOneDot();
m_pCharacter->AddFrame(dot);
}
virtualCCharacter*GetCharacter()
{
returnm_pCharacter;
}
private:
CCharacter*m_pCharacter;
};
//director组装成品
classCCharacterDirector
{
public:
CCharacterDirector(CCharacterBuilder*builder)
{
m_pCharacterBuilder=builder;
}
virtualCCharacter*CreateCharacter()
{
m_pCharacterBuilder->BuilderAcross();
m_pCharacterBuilder->BuilderVertical();
m_pCharacterBuilder->BuilderDot();
returnm_pCharacterBuilder->GetCharacter();
}
private:
CCharacterBuilder*m_pCharacterBuilder;
};
intmain()
{
cout<<"HelloWorld!"<<endl;
CCharacterBuilder*ChaOne=newCCharacterThreeBuilder();
CCharacterDirector*director=newCCharacterDirector(ChaOne);
CCharacter*character=director->CreateCharacter();
// CCharacter*character=ChaOne->GetCharacter();
character->draw();
return0;
}