JS 简单工厂模式,工厂模式(二)

一.什么是工厂模式:

工厂模式就是用来创建对象的一种最常用的设计模式,我们不暴露创建对象的具体逻辑,而是将逻辑封装到一个函数中,那么,这个函数 就可以被视为一个工厂。那么,在实际项目中,我们是不是可以这样子理解呢?

比如我之前做的记事本的项目中,有多个页面有播放录音的功能,为了将该功能的代码实现复用,我对该方法进行了封装,然后页面中,在使用的时候,我点击播放的时候,只是去调用我封装的方法,但是我不需要去考虑 播放的方法里面都有什么。没有暴露函数里面的具体逻辑。其实,工厂模式的根本就是面向对象的三大特性中的封装。

工厂模式根据抽象程度的不同分为简单工厂模式,工厂模式和抽象工厂模式。今天呢,主要和大家分享一下简单工厂和工厂模式这两种。

二.什么是简单工厂模式:

简单工厂模式又叫静态工厂模式,由一个工厂对象决定创建某一种产品对象类的实例,主要用来创建同一类对象。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式可以理解成,一个工厂只生产各种球的工厂,比如篮球,足球这些,客户购买的时候,只表明自己想要类型的球就可以,不必考虑球是怎么生产的。

下面的例子是封装了一个绘制的方法,该方法就相当于是draw的工厂,里面有画线,画矩形的方法,通过传不同的参数控制是选择 画线,还是画矩形的方法。

class TEXT {
    // 画形状
    Draw(val) {
        var draw;
        switch(val) {
            case 'line': 
                draw =new drawLine();
                break;
            case 'rectangle':
                draw = new drawRect();
                break;
        }
        return draw;
    }
}
class drawLine {
    draw() {
        console.log('画线')
    }
}
class drawRect {
    draw() {
        console.log('画矩形')
    }
}
let text = new TEXT();
console.log('text', text.Draw('line').draw())


总结:

简单工厂的优点,在于只需要一个正确的参数,就可以获取所需要的对象,而无需知道其创建的具体细节。但是在函数内,包含了所有对象的创建逻辑,和判断逻辑的代码,每增加新的构造函数还需要修改判断逻辑代码,当我们对象过多的情况下,就难以维护了。所以简单工厂只能作用于创建的对象数量较少,对象的创建逻辑不复杂使用。

三。工厂方法模式:

工厂方法模式的本意是将实际创建对象的工作推迟到子类中,这样核心就变成了抽象类。但是在js中很难像传统面向对象那样去实现创建抽象类。所以在js中我们需要参考他的核心思想。我们将工厂方法看作是一个实例化对象的工厂类,他只做实例化对象这一件事情。

其实,可以简单理解为一个体育用品的工厂,可以生产球类、护具类等,然后球类里面还包含篮球,足球这些。工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象。这样做的目的是将产品类的实例化操作延时到工厂子类中完成,即通过工厂子类来确定究竟应该是实例化哪一个具体产品类。

class TEXT {
    constructor() {
        if(new.target === TEXT){
            throw new Error('抽象类不能实例化!');
        }
    }
}
class DrawAll extends TEXT {
       Draw(val) {
            var draw;
            switch(val) {
                case 'line': 
                    draw =new drawLine();
                    break;
                case 'rectangle':
                    draw = new drawRect();
                    break;
            }
            return draw;
       }
}
class drawLine {
    draw() {
        console.log('画线')
    }
}
class drawRect {
    draw() {
        console.log('画矩形')
    }
}
const drawAll = new DrawAll();
console.log('111', drawAll.Draw('line').draw())

 

原文地址:https://www.cnblogs.com/mn6364/p/10396039.html