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;
}