1. 程式人生 > >c++建立型設計模式--工廠模式--抽象工廠(多個產品的構建--系列)

c++建立型設計模式--工廠模式--抽象工廠(多個產品的構建--系列)

在基類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");
}

測試結果

測試結果