设计模式学习02-工厂方法模式

it2023-06-11  70

工厂方法模式

通过产品类的抽象使其创建业务主要负责用于创建多类产品的实例


简单工厂模式如果需求简单直接创建对象即可,但是随着需求变得复杂,如果用简单工厂模式,那么要添加各种各样的类别,还要修改工厂模式,比如简单工厂模式的

var sportsFactory = function(name) { switch(name) { case 'NBA': return new BasketBall(); case 'wordCup': return new FootBall(); } }

随着类别增加需要不断的修改switch里面代码,所以下面引出工厂方法模式。

文章目录

工厂方法模式一、安全模式类二、安全的工厂模式


一、安全模式类

比如我们创建了一个类,所以用new来实例化,但是其他人可能不知道这个是个类,直接调用的,这样就会发生错误,所以非安全类的例子如下

var NoSafe = function() {} NoSafe.prototype = { show: function() { console.log("安全"); } } var s = NoSafe(); s.show(); // 报错

解决方案很简单,就是在构造函数开始的时候判断当前对象this指代是不是类,如果是则通过new创建对象,否则就是类在全局作用域中执行的,也就是此时this指向的是window,所以这么改

var Safe = function() { if (!(this instanceof Safe)) { return new Safe(); } } Safe.prototype = { show: function() { console.log("安全"); } } var s = Safe(); s.show(); // 可以获取到

二、安全的工厂模式

代码如下(示例):

var Factory = function(type, content) { if (this instanceof Factory) { var s = new this[type](content); return s; } else { return new Factory(type, content); } } // 工厂设置所有类型数据对象的基类 Factory.prototype = { FootBall: function() { ..... }, BasketBall: function() {....}, Volleyball: function() {....} } // 添加数据 var data = [ {type: 'FootBall', content: "足球"}, {type: 'BasketBall', content: "蓝球"}, {type: 'Volleyball', content: "排球"} ]; for (var i = 3; i >= 0; i--) { Factory(data[i].type, data[i].content); }
最新回复(0)