简单工厂模式

166 阅读2分钟

简单工厂模式

设计模式---简单工厂模式,学习记录

以下是我对设计模式中-简单工厂模式的初步认知,如有理解不正确的地方,希望大家能够指出来,也好及时修改,以免对他人有错误的帮助。

实现设计模式选择的语言:JavaScript

什么是简单工厂模式

我认为简单工厂模式,是为了将多个在抽象上相同但是拥有不同的具体实现的功能统一处理并且能够易扩展和降低耦合,而产生的代码组织方式。

凡属于这一类的需求都可以采取简单工厂模式来设计代码。

简单工厂模式的好处

  1. 易扩展
  2. 低耦合

如何实现

假设我们有一个 Animal 类,这是所有具体动物的父类,而且所有的动物都有自己的名字,都会说话。

class Animal{
    type='动物';
    say=function(){}
}

定义三个子类 Dog、Cat、Pig

class Dog extends Animal{
    type='小狗';
    say=function(){
        console.log(`我是${this.type},我会汪汪叫`)
    }
}
class Cat extends Animal{
    type='小猫';
    say=function(){
        console.log(`我是${this.type},我会喵喵叫`)
    }
}
class Pig extends Animal{
    type='小猪';
    say=function(){
        console.log(`我是${this.type},我会哼哼叫`)
    }
}

那么假设我们有一个宠物工厂,可以根据动物的种类来生产具体的宠物

class AnimalFactory{
    static getAnimal(type){
        animal=null;
        switch(type){
            case '小狗':
                animal=new Dog();
                break;
            case '小猫':
                animal=new Cat();
                break;
            case '小猪':
                animal=new Pig();
                break;
            default:
                break;
        }
        return animal;
    }
}

如上述定义,当我们使用的时候,可以直接根据动物的 type 实例化 animal 对象,调用统一的 say 方法。

var animal=AnimalFactory.getAnimal('小猫')
animal.say() //我是小猫,我会喵喵叫

var animal=AnimalFactory.getAnimal('小狗')
animal.say() //我是小狗,我会汪汪叫

var animal=AnimalFactory.getAnimal('小猪')
animal.say() //我是小猪,我会哼哼叫

这样我们就实现一个简单工厂模式的代码设计,如果之后需要新增一种动物,只需要新增一个具体的动物类再继承 Animal 类,例如class Fish extends Animal{},之后具体实现不会影响Dog、Cat、Pig这三个类的具体实现。另外在工厂类新增对应的条件逻辑就可以很快的扩展新的需求。

应用场景

在前端领域,编写组件的时候应该按照组合优于继承的思想,因此并不适合简单工厂。但是在单纯的业务逻辑,不涉及界面的情况下,设计模式中的任意模式都是很适合的。当然,简单工厂模式就很适合这种需求:为了将多个在抽象上相同但是拥有不同的具体实现的功能统一处理并且能够易扩展和降低耦合