c++建立型設計模式--工廠模式--抽象工廠(多個產品的構建--系列)
阿新 • • 發佈:2019-01-02
在基類CarBase基礎上進行構建
基類
#pragma once #include <iostream> /** * 基類指標 *Date :[10/12/2018 ] *Author :[RS] */ class CarBase { public: virtual ~CarBase() { std::cout << "析構 carBase" << std::endl; } virtual void PrintName() { printf("騎車生產廠商:%s\n",mStrName.c_str()); } protected: CarBase() {}; CarBase(const std::string& name) :mStrName(name) {}; std::string mStrName; };
基類的產品有兩種具體產品的抽象子類
#pragma once #include "CarBase.hpp" #include <string> /** *這裡有兩種型別的車型 *Date :[10/12/2018 ] *Author :[RS] */ class BussinessCarBase :public CarBase { protected: BussinessCarBase() {} BussinessCarBase(const std::string& name) :CarBase(name) {} }; class SportCarBase :public CarBase { protected: SportCarBase(){} SportCarBase(const std::string& name) :CarBase(name) {} };
針對兩種不同的基類,不同公司有不同的方案
#pragma once #include "CarType.hpp" /** *對於兩種不同的車型有多公司進行生產 *Date :[10/12/2018 ] *Author :[RS] */ class BaoMaBussinessCar :public BussinessCarBase { public: BaoMaBussinessCar() :BussinessCarBase("寶馬") {} void PrintName()override { printf("寶馬商務車\n"); BussinessCarBase::PrintName(); } }; class BaoMaSportCar :public SportCarBase { public: BaoMaSportCar() :SportCarBase("寶馬") {} void PrintName()override { printf("寶馬跑車車\n"); SportCarBase::PrintName(); } }; class BenCiBussinessCar :public BussinessCarBase { public: BenCiBussinessCar() :BussinessCarBase("賓士") {} void PrintName()override { printf("賓士商務車\n"); BussinessCarBase::PrintName(); } }; class BenCiSportCar :public SportCarBase { public: BenCiSportCar() :SportCarBase("賓士") {} void PrintName()override { printf("賓士跑車車\n"); SportCarBase::PrintName(); } };
抽象工廠方法,其實就是不同公司為了方便客戶,提供的介面,提供針對不同的型別生產不同的產品。達到多個產品的建立
#pragma once
#include "CarFilmType.hpp"
#include <memory>
class AbstructFactoryI {
public:
virtual std::shared_ptr<BussinessCarBase> CreateBassCar() = 0;
virtual std::shared_ptr<SportCarBase> CreateSportCar() = 0;
};
class BaoMaFactory :public AbstructFactoryI {
public:
std::shared_ptr<BussinessCarBase> CreateBassCar()override {
std::shared_ptr<BaoMaBussinessCar> car(new BaoMaBussinessCar());
return car;
}
std::shared_ptr<SportCarBase> CreateSportCar()override {
std::shared_ptr<BaoMaSportCar> car(new BaoMaSportCar());
return car;
}
};
class BenCiFactory :public AbstructFactoryI {
public:
std::shared_ptr<BussinessCarBase> CreateBassCar()override {
std::shared_ptr<BenCiBussinessCar> car(new BenCiBussinessCar());
return car;
}
std::shared_ptr<SportCarBase> CreateSportCar()override {
std::shared_ptr<BenCiSportCar> car(new BenCiSportCar());
return car;
}
};
測試入口
#include "Manager.hpp"
#include "CarFactory.hpp"
#include "CarFactoryMethod.h"
#include "AssemCarFactory.hpp"
#include "AbstructFactory.h"
void main() {
//CarFactory::TEST();
//CarFacotryMethod::Test();
//AssertCarFactory::Test();
BaoMaFactory bm;
BenCiFactory bc;
{
auto bmBCar = bm.CreateBassCar();
bmBCar->PrintName();
}
{
auto bmSCar = bm.CreateSportCar();
bmSCar->PrintName();
auto bcBcar = bc.CreateBassCar();
bcBcar->PrintName();
auto bcScar = bc.CreateSportCar();
bcScar->PrintName();
}
system("pause");
}
測試結果