【设计模式】抽象工厂模式

发布于:2024-05-20 ⋅ 阅读:(153) ⋅ 点赞:(0)

来源: 爱编程的大丙

抽象工厂模式适用于比较复杂多变的业务场景,总体上就是给一系列功能相同但属性会发生变化的组件添加一个抽象类,可以方便后续拓展,再搭配工厂类就可以创建我们需要的对象

抽象工厂模式较与工厂模式其创建的对象对应的类有抽象的基类

代码中的四个抽象类:

ShipBody 类:船体的抽象类
有三个子类,在子类中通过不同的材料来建造船体
Weapon 类:武器的抽象类
有三个子类,在子类中给战船提供不同种类的武器
Engine 类:动力系统抽象类
有三个子类,在子类中给战船提供不同动力系统
AbstractFactory 类:抽象工厂类
在子工厂类中生产不同型号的战船
和ShipBody 、Weapon、Engine有依赖关系,在工厂函数中创建了它们的实例对象
和Ship 类有依赖关系,在工厂函数中创建了它的实例对象

 

#include<iostream>
#include<string>
using namespace std;

//船体
class ShipBody {
public:
	virtual string getShipBody() = 0;
	virtual ~ShipBody() {}
};

class WoodBody :public ShipBody {
public:
	string getShipBody() override {
		return string("用木材制作轮船船体...");
	}
};

class IronBody :public ShipBody {
public:
	string getShipBody() override {
		return string("用钢铁制作轮船船体...");
	}
};

class MetalBody :public ShipBody {
public:
	string getShipBody() override {
		return string("用合金制作轮船船体...");
	}
};

//动力
class Engine {
public:
	virtual string getEngine() = 0;
	virtual ~Engine() {}
};

class Human :public Engine {
public:
	string getEngine()override {
		return string("使用人力驱动...");
	}
};

class Diesel :public Engine {
public:
	string getEngine()override {
		return string("使用内燃机驱动...");
	}
};

class Muclear:public Engine {
public:
	string getEngine()override {
		return string("使用核能驱动...");
	}
};

//武器
class Weapon {
public:
	virtual string getWeapon() = 0;
	virtual ~Weapon() {}
};

class Gun :public Weapon {
public:
	string getWeapon() override {
		return string("配备武器为枪...");
	}
};

class Cannon :public Weapon {
public:
	string getWeapon() override {
		return string("配备武器为自动机关炮...");
	}
};

class Laser :public Weapon {
public:
	string getWeapon() override {
		return string("配备武器为激光...");
	}
};

//轮船类
class Ship {
public:
	Ship(ShipBody* body, Weapon* weapon, Engine* engine) :
		m_body(body), m_weapon(weapon), m_engine(engine){}//初始化列表

	string getProperty() {
		string info = m_body->getShipBody() + m_engine->getEngine() + m_weapon->getWeapon();
		return info;
	}

	~Ship() {
		delete m_body;
		delete m_engine;
		delete m_weapon;
	}
private:
	ShipBody* m_body = nullptr;
	Weapon* m_weapon = nullptr;
	Engine* m_engine = nullptr;
};

//工厂类
class AbstractFactory {
public:
	virtual Ship* createShip() = 0;
	virtual ~AbstractFactory() {}
};

class BasicFactory :public AbstractFactory {
public:
	Ship* createShip() override {
		Ship* ship = new Ship(new WoodBody, new Gun, new Human);
		cout << "<基础性>战船生产完毕,可以下水啦啦啦" << endl;
		return ship;
	}
};

class StandardFactory :public AbstractFactory {
public:
	Ship* createShip() override {
		Ship* ship = new Ship(new IronBody, new Cannon, new Diesel);
		cout << "<标准>战船生产完毕,可以下水啦啦啦" << endl;
		return ship;
	}
};

class UltimateFactory:public AbstractFactory{
public:
	Ship* createShip() override {
		Ship* ship = new Ship(new MetalBody, new Laser, new Muclear);
		cout << "<旗舰型>战船生产完毕,可以下水啦啦啦" << endl;
		return ship;
	}
};

int main() {
	AbstractFactory* factory = new StandardFactory;
	Ship* ship = factory->createShip();
	cout << ship->getProperty() << endl;
	delete ship;
	delete factory;
	return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到