Skip to content

Instantly share code, notes, and snippets.

@kazmura11
Last active July 29, 2020 17:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kazmura11/d17388a3a30fd49fb3a8 to your computer and use it in GitHub Desktop.
Save kazmura11/d17388a3a30fd49fb3a8 to your computer and use it in GitHub Desktop.
Design Pattern Builder
#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