1.简单工厂模式(Simple Factory)
简单工厂模式又被称之为静态工厂方法(Static Factory Method),由一个工厂对象来决定创建一类产品的实例。大概理解起来就是如下图所示,假如有一个需求,需要根据输入的球类名称,来显示参与此项球类的人数及一些相关介绍,用简单工厂模式的话,大概如下图所示:
在不使用简单工厂的模式下,需要有三个基类,意味着我需要记住这三个类的名称,在调用对应的类的函数时,使其呈现我们想要了解的信息。比如我们需要了解篮球比赛每队需要的人数,可以调用其getMem方法,会显示我们需要的信息,前提是我们要记住Basketball这个类,这样的缺陷在于当球类运动过多时,没法准确记住每个球类的名称,这时我们可以将这些类封装在一个工厂函数中,以不同的球类名称作为参数传入,就可以返回对应球类对象,我们实例化该对象,便可调用其对应的方法。具体的代码实现可以参照如下:
let Basketball = function () {
this.info='篮球';
}
Basketball.prototype = {
getMem : function(){
console.log('每个队伍需要5个人')
}
}
let Football = function () {
this.info='足球';
}
Football.prototype = {
getMem : function(){
console.log('每个队伍需要11个人')
}
}
let PingPong= function () {
this.info='乒乓';
}
PingPong.prototype = {
getMem : function(){
console.log('每个队伍需要1个人')
}
}
上面都是各类球的基类,我要想使用对应的类时,可以调用对应类或重新实例化一个,但如果基类有一定数量,且内部形式类似时,我们可以考虑封装成一个工厂类:
let BallFactory = function (name) {
switch (name) {
case 'basketball':
return new Basketball();
case 'football':
return new Football();
case 'pingpong':
return new PingPong();
}
}
这样当我们使用对应的球类工厂时记住BallFactory这个工厂对象就行,它会帮我们拿到对应球类的信息。
简单工厂优势:根据不同的传入参数即可调用对应的产品实例,使用起来较为方便,逻辑性较强。
简单工厂劣势:耦合度较高,一旦工厂类出现问题,导致其它基类使用均受影响,增加基类时需要需改较多代码,而且产品较多时,工厂类会臃肿复杂。
2.工厂方法模式(Factory Method)
在上述的简单工厂模式中,当需求发生变化时,不仅仅需要添加类,还要修改工厂函数,工厂方法模式将实际对象工作推迟到子类当中。这样的好处是在添加类时,只需要在工厂类的原型里添加即可。具体实现参见下面代码:
//工厂类
let Factory = function(name,info){
if(this instanceof Factory){
let str = new this[name](info)
rerurn str;
}else{
return new Factory(name,info)
}
}
//工厂原型中设置创建对象的基类
Factory.prototype = {
Basketball:function(info){
this.info = info;
}
Football:function(info){
this.info = info;
}
PingPongBall:function(info){
this.info = info;
}
}
//实际添加数据时
let data=[
{name:"Basketball",info:"Basketball is very interesting"},
{name:"Football",info:"Football is very creazy"}
{name:"PingPongBall",info:"PingPongBall is very difficult"}
{name:"PingPongBall",info:"Chinese PingPongBall is very outstanding"}
]
上面使用的是安全模式创建工厂对象,当需要添加基类时,我们只需要在Factory.prototype方法中添加一次即可,避免简单工厂模式中至少添加两次的情况。
工厂模式优势:只在原型中工厂方法中添加即可调用,避免多次添加,降低耦合度。
工厂模式劣势:在添加新产品时,需要编写新的产品类和工厂类,增加了函数复杂度和系统开销。
最近对简单工厂与工厂类的一些初步了解,可能有不足,望请多多指教。