怪物工厂——工厂模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怪物工厂——工厂模式相关的知识,希望对你有一定的参考价值。

    在原型模式中模拟游戏怪物的场景中,用户每点击一个按钮模拟游戏场景的变化,程序员都需要手动的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

以上是关于怪物工厂——工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

PHP面向对象之选择工厂和更新工厂

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式-简单工厂工厂方法模式抽象工厂模式详解

设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式学习——简单工厂模式工厂模式抽象工厂模式

C++工厂模式(简单工厂工厂方法抽象工厂)