资讯专栏INFORMATION COLUMN

一天一个设计模式之JS实现——工厂模式

Muninn / 637人阅读

摘要:参考文章深入理解三种工厂模式工厂模式,工厂方法模式,抽象工厂模式详解工厂模式是中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

参考文章:
深入理解java三种工厂模式
工厂模式,工厂方法模式,抽象工厂模式 详解

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

工厂模式根据工厂抽象级别分为三种:
1、简单工厂模式
2、工厂方法模式
3、抽象工厂模式

工厂模式的角色一般有以下几个:
1、抽象工厂类(注:简单工厂无此类)
2、具体工厂类
3、抽象产品类
4、具体产品类

简单工厂模式
class BMW {
    drive() {
        console.log("drive bmw...");
    }
}
class Benz {
    drive() {
        console.log("drive Benz...");
    }
}
class Factory {
    getBMWCar() {
        return new BMW();
    }
    getBenzCar() {
        return new Benz();
    }
}

var f1 = new Factory();
f1.getBMWCar().drive();
f1.getBenzCar().drive();

当需要添加一类产品时,需要在工厂里添加对应的生产逻辑,违背了开闭原则,简单工厂模式只在非常简单的情况下使用。

工厂方法模式

由于简单工厂的弊端明显,更多时候使用到的是工厂方法模式,工厂方法模式把生产过程下放到派生类,所以当添加一类产品的时候只需添加一个工厂,扩展性增强。

注:由于JS没有接口也没有抽象类的说法,用以下的形式模拟。

class FactoryInterface {
    constructor() {
        if (Object.getPrototypeOf(this) === FactoryInterface.prototype) {
            throw new Error("该类是抽象类,无法实例化")
        }
    }
    getCar() {
        throw new Error("派生类必须实现该方法,抽象函数无法直接调用!");
    }
}   
class BMWFactory extends FactoryInterface {
    getCar() {
        return new BMW();
    }
}
class BenzFactory extends FactoryInterface {
    getCar() {
        return new Benz();
    }
}
var bmwF = new BMWFactory();
var benzF = new BenzFactory();
bmwF.getCar().drive();
benzF.getCar().drive();
抽象工厂模式

抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。而且使用抽象工厂模式还要满足以下条件:
1.系统中有多个产品族,而系统一次只可能消费其中一族产品
2.同属于同一个产品族的产品以其使用。
举个例子,宝马和奔驰两个牌子都有越野车和商务车,宝马系的是一个产品族,奔驰系的也是一个产品族,每个产品族下面都有相类似的产品。

class SportsCar {
    constructor() {
        if (Object.getPrototypeOf(this) === SportsCar.prototype) {
            throw new Error("该类是抽象类,无法实例化")
        }
    }
    crossCountry() {
        throw new Error("派生类必须实现该方法,抽象函数无法直接调用!");
    }
}
class BussinessCar {
    constructor() {
        if (Object.getPrototypeOf(this) === BussinessCar.prototype) {
            throw new Error("该类是抽象类,无法实例化")
        }
    }
    talkBusiness() {
        throw new Error("派生类必须实现该方法,抽象函数无法直接调用!");
    }
}
class BMWSportsCar extends SportsCar {
    crossCountry() {
        console.log("宝马去越野");
    }
}
class BenzSportsCar extends SportsCar {
    crossCountry() {
        console.log("奔驰去越野");
    }
}
class BMWBussinessCar extends BussinessCar {
    talkBusiness() {
        console.log("宝马去谈生意");
    }
}
class BenzBussinessCar extends BussinessCar {
    talkBusiness() {
        console.log("奔驰去谈生意");
    }
}
class AbstractFactory {
    constructor() {
        if (Object.getPrototypeOf(this) === AbstractFactory.prototype) {
            throw new Error("该类是抽象类,无法实例化")
        }
    }
    getSportsCar() {
        throw new Error("派生类必须实现该方法,抽象函数无法直接调用!");
    }
    getBussinessCar() {
        throw new Error("派生类必须实现该方法,抽象函数无法直接调用!");
    }
}

class BMWSoleFactory extends AbstractFactory {
    getSportsCar() {
        return new BMWSportsCar();
    }
    getBussinessCar() {
        return new BMWBussinessCar();
    }
}
class BenzSoleFactory extends AbstractFactory {
    getSportsCar() {
        return new BenzSportsCar();
    }
    getBussinessCar() {
        return new BenzBussinessCar();
    }
}

var benf2 = new BenzSoleFactory();
var bmwf2 = new BMWSoleFactory();
benf2.getSportsCar().crossCountry();
benf2.getBussinessCar().talkBusiness();
bmwf2.getSportsCar().crossCountry();
bmwf2.getBussinessCar().talkBusiness();

小结:
工厂模式的作用是解耦了产品的生产和使用部分,让使用需要的产品的时候只需要调用对应的接口即可,减少冗余代码。
优点:1、隐藏了生产过程,只需调用相应接口;2、扩展性好,当需要添加一类产品时,只需添加对应工厂类即可。
与建造者模式区别:工厂模式不需要客户端关心构建过程,只需要了解产品对应的工厂即可;建造者模式更多的是构建拥有复杂的内部结构的对象,过程由Derector控制。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93845.html

相关文章

  • 一天一个设计模式JS实现——建造者模式

    摘要:参考文章设计模式之建造者模式一什么是建造者模式建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 参考文章:java设计模式之建造者模式 一、什么是建造者模式建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓...

    boredream 评论0 收藏0
  • PHP 设计模式二——工厂模式

    摘要:连接邮件服务器的类可以连接邮件服务器的方法有,此时可以写一个工厂类负责实例化这几种连接方法,如果某一天对方增加了连接方法,那么直接在工厂类里做相应的修改即可。扩展性高,如果想增加一个产品,只要扩展一个工厂类或者是修改工厂的生产过程即可。 定义 工厂模式的使用频率比较高。它的定义为:定义一个类,该类主要负责系统的去实例化一些其它的类。通俗点说就是,你告诉我你需要哪个类的实例即可,其它的你...

    cc17 评论0 收藏0
  • php 设计模式工厂模式、单例模式、注册树模式

    摘要:的设计模式有很多种,本文取最简单的三种模式工厂模式单例模式和注册树模式进行简单的讲解。文件创建完后,咱们回到单元测试文件文件再执行一下单元测试命令发现,也能返回成功,这样的话我们就能很方便的修改任何驱动了。 php 设计模式之工厂模式、单例模式、注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具...

    liangzai_cool 评论0 收藏0
  • 我的Java设计模式-策略模式

    摘要:孙膑心里一万个草泥马在奔腾,差点没噎死自己滚一边去,我们这盘跟他赛马开始,策略模式上场。在设计模式之禅中的提出通过策略枚举和反射机制对策略模式进行改良,膜拜了但是要添加或淘汰策略,还是得去对枚举进行修改,也不符合开闭原则。 今天给大家说说田忌赛马的故事。如有雷同,纯属巧合!话说在战国时期,群雄割据,硝烟四起,茶余饭后还是少不了娱乐活动的,其中赛马是最火爆的。一天,孙膑看到田忌像个死鸡似...

    zilu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<