c++ 设计模式 的课本范例

(1) 框架设计模式 model mode : 算法的框架不变,算法的细节可以改变。主要依赖多态。

class Player
{
protected:
	int life;
	int magic;
	int attack;

	virtual void effect_self() {}
	virtual void effect_enemy() {}
	virtual bool can_burn() = 0;
public:
	Player(int life, int magic, int attack) : life(life), magic(magic), attack(attack) {}
	virtual Player(){}

	void play_effect_burn() { cout << "play_effect_burn\n"; }

	void burn()    // 模板模式:算法的框架不变,细节可以变
	{
		if (can_burn())
		{
			effect_enemy();
			effect_self();
			play_effect_burn();
		}
	}
};

class Fighter : public Player
{
public:
	Fighter() : Player(100, 100, 50) {}

	void effect_self() override { this->life -= 30; }
	void effect_enemy() override { cout << "敌人被燃烧 40 血\n"; }
	bool can_burn() override 
	{ 
		if (this->life >= 40)  return true;
		else                   return false; 
	}
};

(2)简单工厂模式:不要直接使用 new A() 创建对象,一旦对类 A 增删和修改参数,会紧耦合,牵一发动全身,用一个函数集中使用 new A ,返回创建好的对象,如同工厂批量生产产品一样。对构造对象时 的修改也限制在工厂方法里。

class Player  // 角色父类
{
protected:
	int life;
	int magic;
	int attack;

public:
	Player(int life, int magic, int attack) : life(life), magic(magic), attack(attack) {}
	virtual Player(){}
};

class Fighter : public Player   // 战士
{
public:
	Fighter() : Player(100, 100, 50) {}
};

class Master : public Player  // 法师
{
public:
	Master() : Player(50, 300, 150) {}
};

class Create   // 把 new 语句集中在产生对象的函数里,减小代码以后升级时需要修改的范围
{
public:
	static Player* createPlayer(string str)
	{
		if(str == "fighter") 
			return new Fighter();
		else if(str == "master")
			return new Master();
	}	
};

int main()
{
	auto pFighter = Create::createPlayer("fighter");
	auto pMaster = Create::createPlayer("master");

	delete pFighter;
	delete pMaster;
	return 0;
}

但工厂函数里的 if 选择,如果要创建新类,会修改原代码。面向对象的 OCP 原则:更新代码时,尽量追加新代码,而不是修改原代码,向增加开放,向修改关闭。如此引出工厂模式。

(3) 工厂模式:符合 OCP 规则的 用工厂方式生产对象:

class Player  // 角色父类
{
protected:
	int life;
	int magic;
	int attack;

public:	Player(int life, int magic, int attack) : life(life), magic(magic), attack(attack) {}
	virtual Player(){}
};

class Fighter : public Player   // 战士
{
public:	Fighter(int life, int magic, int attack) : Player(life , magic , attack) {}
};

class Master : public Player  // 法师
{
public:	Master(int life, int magic, int attack) : Player(life, magic, attack) {}
};

class Create   // 制造生产对象的虚基类
{
public:	virtual Player* createPlayer() = 0;
	virtual Create(){}
};

class Create_Fighter : public Create  // 对应对象的工厂类
{
public:	Player* createPlayer() override { return new Fighter(50,50,50); }
};

class Create_Monster : public Create
{
public:	Player* createPlayer() override { return new Master(60,60,60); }
};

int main()
{
	auto pFactFight = new Create_Fighter();
	auto pFighter = pFactFight->createPlayer();

	auto pFactMaster = new Create_Monster();
	auto pMastr = pFactMaster->createPlayer();

	delete pFactFight;
	delete pFactMaster;
	delete pFighter;
	delete pMastr;
	return 0;
}

(4) 抽象工厂模式,比工厂模式密度更高的生产对象的模式:一个类包含了多个生产对象的函数:

class Player  // 角色父类
{
protected:
	int life;
	int magic;
	int attack;

public:	Player(int life, int magic, int attack) : life(life), magic(magic), attack(attack) {}
	virtual Player(){}
};

class Fighter_Land : public Player   // 陆上战士 
{
public:	Fighter_Land(int life, int magic, int attack) : Player(life , magic , attack) {}
};

class Fighter_Sea : public Player   // 海洋战士
{
public:	Fighter_Sea(int life, int magic, int attack) : Player(life, magic, attack) {}
};

class Master_Land : public Player  // 陆上法师 ,游戏新版本,不同的游戏场景
{
public:	Master_Land (int life, int magic, int attack) : Player(life, magic, attack) {}
};

class Master_Sea : public Player  // 海洋法师
{
public:	Master_Sea(int life, int magic, int attack) : Player(life, magic, attack) {}
};

class Create   // 制造生产对象的虚基类
{
public:	
	virtual Player* createPlayer() = 0;
	virtual Player* createMaster() = 0;
	virtual Create(){}
};

class Create_Land : public Create  // 不同场景下的角色生产工厂
{
public:
	Player* createPlayer() override { return new Fighter_Land(10,10,10); }
	Player* createMaster() override { return new Master_Land(20,20,20); }
};

class Create_Sea : public Create
{
public:
	Player* createPlayer() override { return new Fighter_Sea(10,10,10); }
	Player* createMaster() override { return new Master_Sea(20, 20, 20); }
};

int main()
{
	auto pCreate_Land = new Create_Land();
	auto pFighter_Land = pCreate_Land->createPlayer();;
	auto PMaster_Land = pCreate_Land->createMaster();

	auto pCreate_Sea = new Create_Sea();
	auto pFighter_Sea = pCreate_Sea->createPlayer();
	auto pMaster_Sea = pCreate_Sea->createMaster();

	delete pCreate_Land; delete pFighter_Land; delete PMaster_Land;
	delete pCreate_Sea;  delete pFighter_Sea;  delete pMaster_Sea;

	return 0;
}

工厂模式不要忘记 delete 这些指针,包括在堆区创建的工厂对象和工厂生产的类对象,都要在最后 delete 掉,释放掉。
(5)

谢谢