JavaScript工厂模式详解
目录
- 简单工厂模式(Simple Factory)
- 工厂方法模式(Factory Method)
- 安全的工厂方法
- 抽象工厂模式(Abstract Factory)
- 总结
简单工厂模式(Simple Factory)
文章图片
//篮球基类var Basketball = function() {this.intro = '篮球盛行于美国'; }Basketball.prototype = {getMember: function() {console.log('每个队伍需要五个队员'); },getBallSize: function() {console.log('篮球很大'); }}//足球基类var Football = function() {this.intro = '足球在世界范围内都很流行'; }Football.prototype = {getMember: function() {console.log('每个队伍需要11名队员'); },getBallSize: function() {console.log('足球很大'); }}//运动工厂var SportsFactory = function(name) {switch (name) {case 'NBA':return new Basketball(); case 'worldCup':return new Football(); }}//当你需要为世界杯创建一个足球的时候,只需要记住运功工厂sportsFactory即可,调用并创建var Footnall = SportsFactory('worldCup'); console.log(Footnall); console.log(Footnall.intro); Footnall.getMember();
文章图片
文章图片
//工厂模式function createBook(name, time, type) {var o = new Object(); //创建一个对象,并对对象拓展属性和方法//这是不相似的部分o.name = name; //书本名称o.time = time; //书本出版时间o.type = type; //书本类型//下面是相似的部分o.getName = function() {console.log(this.name); }; //将对象返回return o; }//创建两本书var book1 = new createBook('JS book', 2021, 'js'); var book2 = new createBook('CSS book', 2019, 'css'); book1.getName(); book2.getName();
文章图片
【JavaScript工厂模式详解】
文章图片
工厂方法模式(Factory Method)
文章图片
var Demo = function() {}Demo.prototype = {show: function() {console.log('成功获取'); }}var d = new Demo(); //正确创建实例d.show(); //成功获取var d = Demo(); //错误创建实例d.show(); //炸裂
文章图片
文章图片
var Demo = function() {if (!this instanceof Demo) {//判断this的指向return new Demo(); }}Demo.prototype = {show: function() {console.log('安全模式类真好用'); }}var d = Demo(); d.show();
文章图片
安全的工厂方法
//安全模式创建工厂类var Factory = function(type, content) {if (this instanceof Factory) {var s = new this[type](content); return s; } else {return new Factory(type, content); }}//工厂原型中设置创建所有类型数据对象的基类Factory.prototype = {java: function(content) {//...},UI: function(content) {this.content = content; (function() {var div = document.createElement('div'); div.innerHTML = content; div.style.border = '1px soild red'; document.getElementById('container').appendChild(div); })(content); },php: function(content) {//...},javascript: function(content) {//..}}; //创建对象var data = https://www.it610.com/article/[{ type:'javascript', content: 'js哪家强' },{ type: 'java', content: 'java哪家强' },{ type: 'UI', content: 'UI哪家强' }]; for (let index = 0; index < data.length; index++) {console.log(data[index].type); Factory(data[index].type, data[index].content); }
文章图片
文章图片
抽象工厂模式(Abstract Factory)
文章图片
var Car = function() {}Car.prototype = {getPrice: function() {return new Error('抽象方法不能调用'); },getSpeed: function() {return new Error('抽象方法不能调用'); }};
文章图片
//抽象工厂方法var VehicleFactory = function(subType, superType) {//判断抽象工厂中是否有该抽象类if (typeof VehicleFactory[superType] === 'function') {//缓存类function F() {}; //继承父类属性和方法F.prototype = new VehicleFactory[superType](); //将子类constructor指向子类subType.constructor = subType; //子类原型继承父类subType.prototype = new F(); } else {//不存在该抽象类则抛错throw new Error('未创建该抽象类'); }}; //小汽车抽象类VehicleFactory.Car = function() {this.type = 'car'; }VehicleFactory.Car.prototype = {getPrice: function() {return new Error('抽象方法不能调用'); },getSpeed: function() {return new Error('抽象方法不能调用'); }}; //公交车抽象类VehicleFactory.Bus = function() {this.type = 'bus'; }VehicleFactory.Bus.prototype = {getPrice: function() {return new Error('抽象方法不能调用'); },getPassengerNum: function() {return new Error('抽象方法不能调用'); }}
文章图片
//抽象与实现//宝马汽车子类var BMW = function(price, speed) {this.price = price; this.speed = speed; }; //抽象工厂实现对Car抽象类的继承VehicleFactory(BMW, 'Car'); BMW.prototype.getPrice = function() { //重写方法return this.price; }BMW.prototype.getSpeed = function() {return this.speed; }; //宇通公交车子类var YUTONG = function(price, passenger) {this.price = price; this.passenger = passenger; }; //抽象工厂实现对BUS抽象类的继承VehicleFactory(YUTONG, 'Bus'); YUTONG.prototype.getPrice = function() {return this.price; }YUTONG.prototype.getPassengerNum = function() {return this.passenger; }; //实例化类var myBMW = new BMW('100w', '1000km/h'); console.log(myBMW.getPrice(), myBMW.getSpeed(), myBMW.type);
文章图片
文章图片
总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- 事件代理
- 数组常用方法一
- --木木--|--木木-- 第二课作业#翼丰会(每日一淘6+1实战裂变被动引流# 6+1模式)
- 设计模式-代理模式-Proxy
- 【译】Rails|【译】Rails 5.0正式发布(Action Cable,API模式等)
- java静态代理模式
- VueX(Vuex|VueX(Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式)
- Kotlin基础(10)-代理模式在kotlin中的使用
- 长谈的确是这个时代需要的一种模式
- JavaScript|vue 基于axios封装request接口请求——request.js文件