首页 > 代码库 > 怪物工厂——工厂模式

怪物工厂——工厂模式

    在原型模式中模拟游戏怪物的场景中,用户每点击一个按钮模拟游戏场景的变化,程序员都需要手动的new一个对象,耦合度太高,我们需要了解每个怪物类实现的方法。

    工厂模式提供了一种界面和算法的分离,降低耦合度。调用者想要创建一个对象,只需将想要创建的对象的名称委托给工厂,由工厂根据对象名称返回给调用者。这和我们现实生活中生成产品一样,我们并不需要了解产品生成的具体过程,只需要将订单委托给工厂,由工厂负责生产产品并交付于我们。

    在上述模拟游戏中,用户切换场景后,工厂根据场景不断的生产怪物供玩家娱乐(好像怪怪的表达),类图如下:

技术分享

具体代码:

var Monster = Class.extend({
	_blood:100,
	_att:0,
	ctor:function(blood,att){
		var self = this;
		self._blood = blood;
		self._att = att;
	},
	attack:function(player){
		console.log("对" + "造成" + this._att + "点伤害");
	},
	is_die:function(){
		return this._blood > 0;
	},
	attacked:function(att){
		this._blood -= att;
	}
});

var Mouse = Monster.extend({
	ctor:function(blood,att){
		this._super(blood,att);
	},
	attack:function(player){
		console.log("老鼠类对" + player + "造成" + this._att + "点伤害");
	},
	attacked:function(att){
		console.log("老鼠类防御,造成" + (att - 1) + "伤害");
	}
});

var Sharp = Monster.extend({
	ctor:function(blood,att){
		_super(blood,att);
	},
	attack:function(player){
		console.log("鲨鱼类对" + player + "造成" + this._att + "点伤害");
	},
	attacked:function(att){
		console.log("鲨鱼类防御,造成" + (att - 2) + "点伤害");
	}
});

var Snack = Monster.extend({
	ctor:function(blood,att){
		_super(blood,att);
	},
	attack:function(player){
		console.log("蛇类对" + player + "造成" + this._att + "点伤害");
	},
	attacked:function(att){
		console.log("蛇类防御,造成" + (att - 3) + "伤害");
	}
});

var MonsterFactory = Class.extend({
	factory:{
		"House":{name:"Mouse",blood:100,att:20},
		"Forest":{name:"Snack",blood:120,att:10},
		"Sea":{name:"Shark",blood:100,att:10}
	},
	ctr_monster:function(scene){
		var obj = this.factory[scene];
		return eval("new " + obj.name + "("+obj.blood+ ","+obj.att+")");
	}
});

调用者调用代码:

(function(){
    var factory = new MonsterFactory();
    var mouse = factory.ctr_monster("House");
    mouse.attack("小张");
   })();
   

    工厂模式的优点显而易见,就是降低了耦合度,提高了可扩展性,增加或者修改一个场景产生的怪物,只需要增加或修改factory配置中的值即可。java或者.Net也可以通过反射机制实现上述类似的根据配置的功能。
    工厂模式的缺点也显而易见,新的产品需要新的工厂,增加了类的数量,一定程度上增加了系统的复杂度。


本文出自 “走一停二回头看三” 博客,请务必保留此出处http://janwool.blog.51cto.com/5694960/1881858

怪物工厂——工厂模式