当前位置:网站首页>JS工厂模式_工厂模式进行封装
JS工厂模式_工厂模式进行封装
2022-08-04 09:45:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
工厂模式简述
工厂模式,顾名思义,就是为了创造对象。
工厂模式类似于现实的工厂生产线,可以生产出大量类似的商品。
工厂模式可以分为简单工厂模式跟复杂工厂模式。以下将详细介绍。
简单工厂模式
先来看一个例子~~~
function CarFactory (brand, price) {
var car = new Object();
car.brand = brand;
car.price = price;
car.getPrice = function () {
return this.price;
}
return car;
}
var car1 = CarFactory("牌子A", 10000);
var car2 = CarFactory("牌子B", 20000);
console.log(JSON.stringify(car1)); // {
"brand":"牌子A","price":10000}
console.log(JSON.stringify(car2)); // {
"brand":"牌子B","price":20000}
console.log(typeof car1); // object
console.log(typeof car2); // object
console.log(car1 instanceof Object); // true
复制代码
如上代码:函数CarFactory接受两个参数brand, price,最终返回一个对象。如果多次调用这个函数,每次将返回一个新的对象,这就跟工厂的生产线一样。
简单工厂模式的优点在于:能解决多个相似的问题,减少大量冗余代码。
当然,简单工厂模式的缺点也很突出:即无法识别对象类型(typeof car1 === ‘object’)
为了解决简单工厂模式无法识别对象类型的问题,复杂工厂模式便登场了~~~
复杂工厂模式
再看一个例子~~~
function ComplexCarFactory(brand, price) {
this.brand = brand;
this.price = price;
}
ComplexCarFactory.prototype = {
constructor: ComplexCarFactory,
sellCar: function(){
var speed = this.getSpeed(this.brand);
console.log(this.brand + '的车子售价:' + this.price + '元人民币,限速' + speed + '公里每小时');
},
getSpeed : function(brand){
throw new Error("父类是抽象类不能直接调用,需要子类重写该方法");
}
};
var CarChild = function(brand, price) {
this.brand = brand;
this.price = price;
// 继承构造函数父类中的属性和方法
ComplexCarFactory.call(this, brand, price);
};
// 子类继承父类原型方法
CarChild.prototype = Object.create(ComplexCarFactory.prototype);
// CarChild 子类重写父类的方法
CarChild.prototype.getSpeed = function(brand){
var speed = null;
if(brand === '牌子C'){
return 100;
}
return 50;
}
var car3 = new CarChild("牌子C", 3000);
console.log(car3); // CarChild {brand: "牌子C", price: 3000}
console.log(car3.sellCar()); // 牌子C的车子售价:3000元人民币,限速50公里每小时
复制代码
如上代码:
ComplexCarFactory为父类,CarChild为子类,CarChild继承自ComplexCarFactory。
ComplexCarFactory不在进行对象实例化,只对创建过程中的一般性问题进行处理,ComplexCarFactory就像是Java中的抽象类,必须被子类重写,否则调用ComplexCarFactory的sellCall方法时就会抛出异常。
CarChild继承自ComplexCarFactory,同时重写了父类的方法,CarChild类实例后的对象之间是相互独立的,具体的业务逻辑会放在子类中进行编写。
总结
工厂模式最重要的优点是:可以在父类实现一些相同的方法,而具体要实现的业务逻辑可以放在子类中,通过子类重写父类的方法,去实现自己的业务逻辑。
工厂模式弱化对象间的耦合,父类专注于实现重复性的功能,子类专注于具体的业务逻辑,这样可以减少冗余代码。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/107159.html原文链接:https://javaforall.cn
边栏推荐
猜你喜欢
数据使用要谨慎——不良数据带来严重后果
Win7C盘不能扩大怎么办?Win7C盘扩展卷不能点怎么解决
MindSpore:【AIR模型导出】导出时提示源码中select_op参数类型转换失败
Techwiz OLED:OLED器件的发光效率
OAK-FFC-4P全网首次测试
命里有时终须有--记与TiDB的一次次擦肩而过
I am 37 this year, and I was rushed by a big factory to...
Cloud function to achieve automatic website check-in configuration details [Web function/Nodejs/cookie]
leetcode二叉树系列(二)
被Win11安全中心误删除的文件怎么恢复?
随机推荐
Anton Paar Anton Paar Density Meter Hydrometer Repair DMA35 Performance Parameters
GBsae 8 c database using an error, how to do?
【C补充】指向指针或函数的指针
KubeDNS 和 CoreDNS
LVGL's multi-language conversion tool -- a good assistant for font settings
leetcode二叉树系列(一)
TiDB升级与案例分享(TiDB v4.0.1 → v5.4.1)
Detailed explanation of MSTP protocol configuration on Layer 3 switches [Huawei eNSP experiment]
三层交换机/路由器OSPF配置详解【华为eNSP实验】
MySQL binlog都有哪些模式?
请你谈谈网站是如何进行访问的?【web领域面试题】
LeetCode中等题之设计循环队列
IDEA启动热部署
路由/三层交换机DHCP下发地址详解【华为eNSP】
PD 源码分析- Checker: region 健康卫士
Person.class.getInterfaces() 注意使用方法
TiFlash 源码阅读(五) DeltaTree 存储引擎设计及实现分析 - Part 2
常用的输入对象
请问下Flink SQL如何写hologres分区表?我想要每天一个分区
【正点原子STM32连载】第四章 STM32初体验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1