Reliable - trochę więcej buildera

This commit is contained in:
Sasza Stanczew 2024-05-07 11:43:49 +02:00
parent 145b2001f2
commit 6bb7c5050d
4 changed files with 56 additions and 51 deletions

View file

@ -1,18 +0,0 @@
#pragma once
#include <Ship/Cargo.h>
#include <memory>
class CargoBuilder {
public:
CargoBuilder();
[[nodiscard]] std::unique_ptr<Cargo> build();
CargoBuilder& setName(const std::string& name);
CargoBuilder& setAmount(int amount);
private:
std::unique_ptr<Cargo> _cargo;
};

View file

@ -0,0 +1,28 @@
#pragma once
#include <Ship/Cargo.h>
#include <memory>
class CargoFactory {
public:
CargoFactory();
[[nodiscard]] virtual std::unique_ptr<Cargo> create(const std::string &name, int amount);
CargoFactory& setName(const std::string& name);
CargoFactory& setAmount(int amount);
private:
std::unique_ptr<Cargo> _cargo;
};
class ItemFactory : public CargoFactory {
[[nodiscard]] std::unique_ptr<Cargo> create(const std::string &name, int amount);
};
class AlcoholFactory : public CargoFactory {
[[nodiscard]] std::unique_ptr<Cargo> create(const std::string &name, int amount);
};
class FruitFactory : public CargoFactory {
[[nodiscard]] std::unique_ptr<Cargo> create(const std::string &name, int amount);
};

View file

@ -1,33 +0,0 @@
#include "Ship/CargoBuilder.h"
#include <Core/PrettyPrintVisitor.h>
#include <iostream>
CargoBuilder::CargoBuilder()
: _cargo(std::make_unique<Cargo>()) {
}
std::unique_ptr<Cargo> CargoBuilder::build() {
if (!_cargo) {
std::cout << "Builder may be use once\n";
return nullptr;
}
// Check mandatory fields
if (_cargo->_name.empty() || _cargo->_amount == -1) {
std::cout << "Mandatory fields are not set!\n";
return nullptr;
}
_cargo->initialize();
return std::move(_cargo);
}
CargoBuilder& CargoBuilder::setName(const std::string& name) {
_cargo->_name = name;
return *this;
}
CargoBuilder& CargoBuilder::setamount(int amount) {
_cargo->_amount = amount;
return *this;
}

View file

@ -0,0 +1,28 @@
#include "Ship/CargoFactory.h"
#include <Core/PrettyPrintVisitor.h>
#include <iostream>
CargoFactory::CargoFactory()
: _cargo(std::make_unique<Cargo>()) {
}
CargoFactory& CargoFactory::setName(const std::string& name) {
_cargo->_name = name;
return *this;
}
CargoFactory& CargoFactory::setamount(int amount) {
_cargo->_amount = amount;
return *this;
}
[[nodiscard]] std::unique_ptr<Cargo> ItemFactory::create(const std::string &name, int amount) override {
return std::unique_move(_cargo);
}
[[nodiscard]] std::unique_ptr<Cargo> AlcoholFactory::create(const std::string &name, int amount) override {
return std::unique_move(_cargo);
}
[[nodiscard]] std::unique_ptr<Cargo> FruitFactory::create(const std::string &name, int amount) override {
return std::unique_move(_cargo);
}