** ν©ν 리 ν¨ν΄μ΄λ? **
π μ μ
κ°μ²΄λ₯Ό μμ±ν λ κ·Έ κ°μ²΄μ μμ±μλ₯Ό μ§μ νΈμΆνμ§ μκ³ , κ°μ²΄ μμ±μ λ΄λ΄νλ ν©ν 리μ μμ²νλ ꡬ쑰λ₯Ό λ»νλ€.
π μ₯μ
1. κ°μ²΄λ₯Ό μμ±νλ μ½λκ° νλ‘κ·Έλ¨μ μ΄κ³³μ κ³³μ μ°λ§νκ² ν©μ΄μ§μ§ μκ³ κ°μ²΄λ₯Ό μμ±νλ κΈ°λ₯μ ν κ³³μ λͺ¨μλ μ μλ€.
2. ν΄λμ€ νμ μ μ νν λͺ°λΌλ ν΄λμ€ κ³μΈ΅μ λ§κ² κ°μ²΄λ₯Ό μμ±ν μ μλ€.
3. ν©ν 리λ ν΄λμ€ κ³μΈ΅μ λ°λΌ μ€νν μ μλ€.
4. κ°μ²΄λ₯Ό μ νν μμλ‘ μμ±νλ €λ©΄ 볡μ‘ν λ¨κ³κ° νμνκ±°λ, μμ±λ κ°μ²΄λ₯Ό νμ λ€λ₯Έ κ°μ²΄μ μΌμ ν λ°©μμΌλ‘ μ°κ²°ν΄μΌ ν λ ν©ν 리λ₯Ό μ¬μ©νλ©΄ νΈνλ€.
** ν©ν 리 μ’ λ₯ **
π μ μ ν©ν°λ¦¬ λ©μλ (static factory method)
κ°μ²΄λ₯Ό μμ±ν΄μ 리ν΄νλ ν¨μ.
class Point
{
// use a factory method
Point(float x, float y) : x(x), y(y){}
public:
float x, y;
friend class PointFactory;
};
class PointFactory
{
static Point NewCartesian(float x, float y)
{
return Point{ x,y };
}
static Point NewPolar(float r, float theta)
{
return Point{ r*cos(theta), r*sin(theta) };
}
};
πΈ μ¬κΈ°μ μ κΉ !! πΈ
* ν©ν 리 ν¨μμ staticμ μ¬μ©νλ μ΄μ λ λκΉ ?
κ°μ²΄λ₯Ό μμ±νμ§ μκ³ static λ©μλμ μ κ·Όμ΄ κ°λ₯νκΈ° λλ¬Έμ΄λ€. staticμ μ¬μ©νλ©΄ ν΄λμ€κ° λ©λͺ¨λ¦¬μ μ¬λΌκ°λ μ΄λ―Έ μλμ μΌλ‘ μμ±λκΈ° λλ¬Έμ μΈμ€ν΄μ€λ€μ΄ 곡ν΅μ μΌλ‘ κ°μ μ μ§ν΄μΌν λ μ¬μ©νλ€. μΈμ€ν΄μ€κ° νμμκΈ° λλ¬Έμ λ©μλ νΈμΆμ΄ 짧μμ§κΈ° λλ¬Έμ ν¨μ¨μ΄ μ¬λΌκ°λ μ₯μ μ΄ μλ€.
* λ©μλλ?
μ΄λ€ ν΄λμ€μ λ©€λ²ν¨μλ₯Ό μλ―Ένλ€.
π ν©ν°λ¦¬
κ°μ²΄λ₯Ό μμ±νλ ν¨μλ€μ λ³λμ ν΄λμ€μ λͺ°μλ£μ ν΄λμ€λ₯Ό ν©ν°λ¦¬λΌκ³ νλ€.
π λ΄λΆ ν©ν°λ¦¬
μμ±ν νμ μ λ΄λΆ ν΄λμ€λ‘μ μ‘΄μ¬νλ κ°λ¨ν ν©ν°λ¦¬λ₯Ό λ§νλ€. friend ν€μλμ ν΄λΉνλ λ¬Έλ²μ΄ μλ νλ‘κ·Έλλ° μΈμ΄λ€μμλ λ΄λΆ ν©ν°λ¦¬λ₯Ό ννκ² μ¬μ©νλ©°, ν©ν°λ¦¬κ° μμ±ν΄μΌ ν ν΄λμ€κ° λ¨ ν μ’ μΌ λ μ μ©νλ€.
μμ±ν νμ μ λ΄λΆ ν΄λμ€μ΄κΈ° λλ¬Έμ privateλ©€λ²λ€μ μλμ μΌλ‘ μμ λ‘μ΄ μ κ·Ό κΆνμ κ°μ§λ€λ μ μ΄ μλ€. λ΄λΆ ν΄λμ€λ₯Ό 보μ ν μΈλΆ ν΄λμ€λ λ΄λΆ ν΄λμ€μ private λ©€λ²λ€μ μ κ·Όν μ μλ€.
π μΆμ ν©ν°λ¦¬
μ¬λ¬ μ’ λ₯μ μ°κ΄ κ°μ²΄λ€μ μμ±ν΄μΌ ν κ²½μ°μ¬μ©νλ€.
class CarFactory
{
public:
virtual ~CarFactory() = default; //νμ κ°μ μλ©Έμλ‘ μ μνλ€.
std::unique_ptr<Car> requestCar();
size_t getNumberOfCarsProduced() const;
protected:
virtual std::unique_ptr<Car> createCar() = 0;
private:
size_t mNumberOfCarsProduced = 0;
};
class FordFactory : public CarFactory
{
protected:
virtual std::unique_ptr<Car> createCar() override;
};
class ToyotaFactory : public CarFactory
{
protected:
virtual std::unique_ptr<Car> createCar() override;
};
//---------------------------------------------------------------------//
std::unique_ptr<Car> CarFactory::requestCar()
{
++mNumberOfCarsProduced;
return createCar();
}
size_t CarFactory::getNumberOfCarsProduced() const
{
return mNumberOfCarsProduced;
}
std::unique_ptr<Car> FordFactory::createCar()
{
return std::make_unique<Ford>();
}
std::unique_ptr<Car> ToyotaFactory::createCar()
{
return std::make_unique<Toyota>();
}
//---------------------------------------------------------------------//
class LeastBusyFactory : public CarFactory
{
public:
explicit LeastBusyFactory(vector<unique_ptr<CarFactory>>&& factories);
// explicit μμ μ΄ μ€μ ν λ°©μμΌλ‘λ§ κ°μ²΄λ₯Ό λ§λλ €κ³ ν λ.
// μ¬λ¬ 곡μ₯μ κ°λ LeastBusyFactory μΈμ€ν΄μ€λ₯Ό μμ±νλ€.
protected:
virtual unique_ptr<Car> createCar() override;
private:
vector<unique_ptr<CarFactory>> mFactories;
};
LeastBusyFactory::LeastBusyFactory(vector<unique_ptr<CarFactory>>&& factories)
: mFactories(std::move(factories))
{
if (mFactories.empty())
throw runtime_error("No factories provided.");
}
unique_ptr<Car> LeastBusyFactory::createCar()
{
CarFactory* bestSoFar = mFactories[0].get();
for (auto& factory : mFactories) {
if (factory->getNumberOfCarsProduced() <
bestSoFar->getNumberOfCarsProduced()) {
bestSoFar = factory.get();
}
}
return bestSoFar->requestCar();
}
π ν¨μν ν©ν°λ¦¬
ν΄λμ€ λμ ν¨μμ ννλ‘ μ‘΄μ¬νλ ν©ν°λ¦¬
class DrinkWithVolumeFactory
{
map<string, function<unique_ptr<HotDrink>()>> factories;
public:
DrinkWithVolumeFactory()
{
factories["tea"] = [] {
auto tea = make_unique<Tea>();
tea->prepare(200);
return tea;
};
factories["Coffee"] = [] {
auto coffee = make_unique<Coffee>();
coffee->prepare(10);
return Coffee;
};
}
unique_ptr<HotDrink> make_drink(const string& name);
};
inline unique_ptr<HotDrink> DrinkWithVolumeFactory::make_drink(const string& name)
{
return factories[name]();
}
** μΆμ² **
1. λͺ¨λ c++ λμμΈ ν¨ν΄ / λλ―ΈνΈλ¦¬ λ€μ€ν°λ£© μ§μ / μΆνμ¬ : κΉλ²
2. μ λ¬Έκ°λ₯Ό μν c++ (κ°μ 4ν) : C++17 / λ§ν¬ κ·Έλ κ³ λ¦¬ μ§μ / μΆνμ¬ : νλΉ λ―Έλμ΄
'π¨π»βπ» programming > β½ λμμΈ ν¨ν΄' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λμμΈ ν¨ν΄] μμ± ν¨ν΄ - 2. μ±κΈν΄ (singleton) (4) | 2023.08.23 |
---|
μ νλ κ² λ³΄λ€ λ«κ² μ§
ν¬μ€ν μ΄ μ’μλ€λ©΄ "μ’μμβ€οΈ" λλ "ꡬλ ππ»" ν΄μ£ΌμΈμ!