#pragma once
/*=========================================
Builder Pattern
=========================================*/
/*
복잡한 객체를 단계별로 구성할 수 있는 방법을 제공하여 객체의 구성 과정과 표현을 분리하여
동일한 구성 과정으로 다양한 표현을 생성할 수 있게 한다.
장점
ㄴ 가독성 향상 : 객체 생성의 과정이 명확해져 가독성이 높아진다.
ㄴ 불변 객체 생성 : 불변 객체를 쉽게 만들 수 있어, 객체의 상태 변경을 방지할 수 있다.
ㄴ 유연성 : 다양한 구성 요소를 조합하여 객체를 생성할 수 있어, 다양한 상황에 맞게 객체를 쉽게 조정할 수 있다.
단점
ㄴ 복잡성 증가 : Builder 클래스를 추가함으로써 전체 코드 구조가 복잡해질 수 있다.
ㄴ 성능 문제 : Builder 패턴이 객체를 생성하는 과정에서 성능 저하를 초래할 수 있다.
*/
/*
Parts: 부품들의 기본 클래스
*/
class Parts
{
public:
virtual ~Parts() {}
virtual string getModelName() const = 0;
virtual string getDescription() const = 0;
protected:
string _model;
string _description;
};
/*
CPU: CPU 부품 클래스
ECPUModel: CPU Model
*/
enum class ECPUModel
{
AMD_RYZEN_5_5600X,
AMD_RYZEN_7_5800X,
AMD_RYZEN_9_5900X
};
class CPU : public Parts
{
public:
CPU() {};
CPU(ECPUModel model)
{
setModel(model);
}
CPU(const CPU& cpu)
{
this->_model = cpu._model;
this->_description = cpu._description;
}
public:
void setModel(ECPUModel type)
{
switch (type)
{
case ECPUModel::AMD_RYZEN_5_5600X:
_model = "AMD_RYZEN_5_5600X";
_description = "6 Core 12 Threads";
break;
case ECPUModel::AMD_RYZEN_7_5800X:
_model = "AMD_RYZEN_7_5800X";
_description = "8 Core 16 Threads";
break;
case ECPUModel::AMD_RYZEN_9_5900X:
_model = "AMD_RYZEN_9_5900X";
_description = "12 Core 24 Threads";
break;
default:
_model = "Unknown";
_description = "해당하는 모델이 없습니다.";
cerr << "Warning: " << _description << "\n";
break;
}
}
string getModelName() const override
{
return _model;
}
string getDescription() const override
{
return _description;
}
};
/*
MainBoard: MainBoard 부품 클래스
EMainBoardModel: MainBoard Model
*/
enum class EMainBoardModel
{
ASUS_A450,
ASUS_B550,
ASUS_X570
};
class MainBoard : public Parts
{
public:
MainBoard() {};
MainBoard(const MainBoard& mainBoard)
{
this->_model = mainBoard._model;
this->_description = mainBoard._description;
}
MainBoard(EMainBoardModel model)
{
setModel(model);
}
public:
void setModel(EMainBoardModel type)
{
switch (type)
{
case EMainBoardModel::ASUS_A450:
_model = "ASUS_A450";
_description = "ASUS_A450 저가형";
break;
case EMainBoardModel::ASUS_B550:
_model = "ASUS_B550";
_description = "ASUS_B550 중급형";
break;
case EMainBoardModel::ASUS_X570:
_model = "ASUS_X570";
_description = "ASUS_X570 고급형";
break;
default:
_model = "Unknown";
_description = "해당하는 모델이 없습니다.";
cerr << "Warning: " << _description << "\n";
break;
}
}
string getModelName() const override
{
return _model;
}
string getDescription() const override
{
return _description;
}
};