Skip to content

Latest commit

 

History

History
79 lines (66 loc) · 3.01 KB

工厂方法模式.md

File metadata and controls

79 lines (66 loc) · 3.01 KB

JavaScript设计模式之工厂方法模式

学习一个东西,一定要明白这个东西的概念是什么,这个东西被提出来的目的是什么

前言

在之前,我们介绍过简单工厂设计模式,简单工厂设计模式存在唯一的工厂类,它的优点是所有产品类的实例化集中管理,便于理解。当产品数量较少,且不会经常发生变化时,我们当然可以直接使用简单工厂模式,但是有的时候,需求是在时刻变化的,产品类也可能随之增加,如果使用简单工厂模式,就避免不了去修改工厂类的代码。要解决这个问题,就得使用今天所讲的,工厂方法模式。

工厂方法模式本意是将实际创建对象的工作推迟到子类当中。这样核心类就成为了抽象类。

基本概念

工厂方法模式:不再有一个唯一的工厂类就创建产品,而是将不同的产品交给对应的工厂子类去实现。每个产品由负责生产的子工厂来创造。如果添加新的产品,需要做的是添加新的子工厂和产品,而不需要修改其他的工厂代码。

工厂方法模式主要有三种类组成:

  • 抽象工厂类:负责定义创建产品的公共接口
  • 产品子工厂:继承抽象工厂类,实现抽象工厂类提供的接口
  • 每一种产品各自的产品类

安全模式类

安全模式类就是可以屏蔽对类的错误使用而造成的后果。说白了,就是在构造函数开始时先判断当前对象this指向是不是类。

var Demo = function() {
  if(!(this instanceof Demo)){
      return new Demo();
  }
}
Demo.prototype.show = function() {
  console.log('show')
}

var d = Demo();
d.show();

工厂方法模式

简单工厂模式仅仅适用于创建比较少的对象,如果需要创建多个类,并且会经常修改,像我们之前说的简单工厂的方法就不是很实用了,因为如果我要多添加一个类,就需要修改两个地方,所以这里我们采用工厂方法模式

var Factory = function(type,content) {
  if(this instanceof Factory){
      var temp = new this[type](content);
  }else{
      return new Factory(type,content);
  }
}
//在工厂原型中设置创建所有类型数据对象的基类
Factory.prototype = {
    constructor:Factory,
    Java:function(content) {
      //...
    },
    JavaScript:function(content) {
      //...
    },
    UI:function(content) {
      this.content = content;
      (function(content) {
        var div =  document.createElement('div');
        div.innerHTML = content;
        div.style.border = '1px solid red';
        document.getElementById(content).appendChild(div);
        
      })(content)
    }
}

如上,我们就可以创建多个类了

var data = [
    {type:'JavaScript',content:'Javascript还是很重要的'},
    {type:'Java',content:'Java培训哪家强'},
    {type:'UI',content:'UI...'}
];

for(var i = 0,length=data.length;i++;i<data.length){
    Factory(data[i].type,data[i].content);
}