设计模式一(简单工厂模式和工厂方法模式)

我心飞翔 分类:javascript

简单工厂模式和工厂方法模式

版权声明:本文为CSDN博主「程可爱」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接blog.csdn.net/qq_33479841…

1.简单工厂模式(Simple Factory)

简单工厂模式又被称之为静态工厂方法(Static Factory Method),由一个工厂对象来决定创建一类产品的实例。大概理解起来就是如下图所示,假如有一个需求,需要根据输入的球类名称,来显示参与此项球类的人数及一些相关介绍,用简单工厂模式的话,大概如下图所示:

image.png

在不使用简单工厂的模式下,需要有三个基类,意味着我需要记住这三个类的名称,在调用对应的类的函数时,使其呈现我们想要了解的信息。比如我们需要了解篮球比赛每队需要的人数,可以调用其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方法中添加一次即可,避免简单工厂模式中至少添加两次的情况。

工厂模式优势:只在原型中工厂方法中添加即可调用,避免多次添加,降低耦合度。

工厂模式劣势:在添加新产品时,需要编写新的产品类和工厂类,增加了函数复杂度和系统开销。

回复

我来回复
  • 暂无回复内容