首页 > 网站 > WEB开发 > 正文

javascript工厂模式

2024-04-27 15:04:28
字体:
来源:转载
供稿:网友

简单工厂

单纯使用new会导致两个类之间的依赖性,当有多个类构造时,使用一个方法来实例化哪个具体的类,如下面的Fruit水果商店类,通过一个简单的switch层来判断。

var FruitShop = function(){}; FruitShop.PRototype = { showFruit: function(model){ var fruit; switch(model){ case 'Apple': fruit = new Apple(); break; case 'Banana': fruit = new Banana(); break; default: fruit = new Pear(); } Interface.check(fruit, FruitShop); //实现了FruitShop接口 fruit.wash(); fruit.sell(); return fruit; } }

各种水果之间可以互换使用,因为它们实现了接口FruitShop,因此拥有了水果的wash和sell方法,有关Interface类和check函数可以参考另一篇js中的接口,如果不实现相同接口,工厂模式所谓的批量生产类似对象的作用就失效了。 如果想增加一类水果怎么办,还要修改Fruit类,然而Fruit类的功能并没有修改,这样的话我们考虑把创建新实例的逻辑再分离出来,以后想增加水果修改FruitFactory类就可以

var FruitFactory = { createFruit: function(model){ var fruit; switch(...) return fruit; } } var FruitShop = function(){}; FruitShop.prototype = { showFruit: function(model){ var fruit = FruitFactory.createFruit(model); fruit.wash(); fruit.sell(); return fruit; } }

真正的工厂模式

现在我们想让每种水果决定从哪一类公司进货

var FruitShop = function(){}' FruitShop.prototype = { showFruit: function(model){ var fruit = this.createFruit(model); fruit.wash(); fruit.sell(); return fruit; }, createFruit: function(model){ throw new Error('Unsupported Operation on a abstract class'); } }

Fruit现在是一个抽象类,它不能被实例化,设计一个特定的水果类需要扩展Fruit,重定义其中的createFruit方法。关于extend方法可以参考我另一篇js中的extend方法

var Ashop = function(){}; extend(Ashop, FruitShop); Ashop.prototype.createFruit = function(model){ var fruit; switch(model){ case 'Apple': fruit = new Apple(); break; case 'Banana': fruit = new Banana(); break; default: fruit = new Pear(); } Interface.check(fruit, Fruit); //实现了Fruit接口 fruit.wash(); fruit.sell(); return fruit; } var Bshop = function(){}; extend(Bshop, FruitShop); Bshop.prototype.createFruit = function(model){ ... }

这些工厂方法生成的对象都实现了FruitShop接口,所以在其他代码眼中可以互换,现在的水果可以是Ashop或者Bshop中进货的:

var shop1 = new Ashop(); var apple = shop1.showFruit('Apple'); var shop2 = new Bshop(); var apple = shop2.showFruit('Apple');

我们可以对每个子类进行修改,以支持相关厂家的不同水果,这是工厂模式最重要的特点。对fruit一般性的操作逻辑放在父类fruitShop中,而具体的fruit对象实例化则留在子类中,一般性的代码集中在父类,而有变化的代码封装在子类中。

总结

如果需要像水果一样,有多种需要实现同一接口的对象,这时我们就需要使用工厂模式对new对象的过程进行一些逻辑分析和封装


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表