Last active
July 29, 2020 17:22
-
-
Save kazmura11/d17388a3a30fd49fb3a8 to your computer and use it in GitHub Desktop.
Design Pattern Builder
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <string> | |
#include <iostream> | |
#include <vector> | |
#include <memory> | |
// ピザ | |
class Pizza { | |
public: | |
void setDough(const std::string& dough) { | |
dough_ = dough; | |
} | |
void setSauce(const std::string& sauce) { | |
sauce_ = sauce; | |
} | |
void setTopping(const std::string& topping) { | |
topping_ = topping; | |
} | |
void open() const { | |
std::cout << dough_ << "生地で、" | |
<< sauce_ << "ソースで、" | |
<< topping_ << "のトッピングのピザ" << std::endl; | |
} | |
private: | |
std::string dough_; // パン生地 | |
std::string sauce_; // ソース | |
std::string topping_; // トッピング | |
}; | |
// 抽象ピザBuilder | |
class AbstractPizzaBuilder { | |
public: | |
virtual ~AbstractPizzaBuilder() {} | |
std::unique_ptr<Pizza> getPizza() { | |
return move(pizza_); | |
} | |
void createNewPizzaProduct() { | |
pizza_ = std::make_unique<Pizza>(); | |
} | |
virtual void buildDough() = 0; | |
virtual void buildSauce() = 0; | |
virtual void buildTopping() = 0; | |
protected: | |
std::unique_ptr<Pizza> pizza_; | |
}; | |
// ハワイアンピザBuilder | |
class HawaiianPizzaBuilder : public AbstractPizzaBuilder { | |
public: | |
virtual ~HawaiianPizzaBuilder() override {} | |
virtual void buildDough() override { | |
pizza_->setDough("クロス"); | |
} | |
virtual void buildSauce() override { | |
pizza_->setSauce("マイルドな"); | |
} | |
virtual void buildTopping() override { | |
pizza_->setTopping("ハムとパイナップル"); | |
} | |
}; | |
// スパイシーピザBuilder | |
class SpicyPizzaBuilder : public AbstractPizzaBuilder { | |
public: | |
virtual ~SpicyPizzaBuilder() override {} | |
virtual void buildDough() override { | |
pizza_->setDough("焼いたパン"); | |
} | |
virtual void buildSauce() override { | |
pizza_->setSauce("辛い"); | |
} | |
virtual void buildTopping() override { | |
pizza_->setTopping("ペペロニとサラミ"); | |
} | |
}; | |
// インスタンスを生成するクラス | |
class Cook { | |
public: | |
Cook& setPizzaBuilder(std::unique_ptr<AbstractPizzaBuilder> pb) { | |
pizzaBuilder_ = std::move(pb); | |
return *this; | |
} | |
// 設定された型(クラス)に合わせて一気にインスタンスを生成し、さらにPizzaを返すクラス | |
std::unique_ptr<Pizza> build() { | |
pizzaBuilder_->createNewPizzaProduct(); // インスタンス生成 | |
pizzaBuilder_->buildDough(); | |
pizzaBuilder_->buildSauce(); | |
pizzaBuilder_->buildTopping(); | |
return pizzaBuilder_->getPizza(); | |
} | |
private: | |
std::unique_ptr<AbstractPizzaBuilder> pizzaBuilder_; | |
}; | |
int main() { | |
Cook cook; | |
std::unique_ptr<Pizza> hawaian = cook.setPizzaBuilder(std::make_unique<HawaiianPizzaBuilder>()).build(); | |
hawaian->open(); | |
std::unique_ptr<Pizza> spicy = cook.setPizzaBuilder(std::make_unique<SpicyPizzaBuilder>()).build(); | |
spicy->open(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment