工厂模式
工厂模式就是用来创建对象的一种最常见的设计模式,不需要创建对象的具体逻辑,而是将逻辑封装在一个函数中,那么这个函数就可以视为一个工厂,工厂模式根据抽象程度的不同可以分为简单工厂,工厂方法和抽象工厂
简单工厂模式
简单工厂模式又叫静态工厂模式,是由一个工厂对象决定创建某一种产品对象类的实例,主要用来创建同一类对象。
function createPop(type, text) {
var o = new Object()
o.content = text
o.show = function() {
}
if(type == "alert") {
}
if(tpye == "prompt") {
}
if(type == "confirm") {
}
return o
}
var userNameAlert = createPop('alert', '用户只能是26个字母和数字')
简单工厂模式的优点就是,只需要传递一个正确的参数,就可以获得到所有需要的对象,不需要知道细节
工厂方法模式
通过对产品类的抽象使其创建业务主要用来负责创建多类产品的实例
var Factory = function(type, content) {
if(this instanceof Factory) {
var s = new this[type](content)
return s
} else {
return new Factory(type, content)
}
}
Factory.prototyp = {
java: funtion() {},
javascript: function() {},
ui: function() {}
}
class User {
constructor(name = '', viewPage = []) {
if(new.target === User) {
throw new Error('抽象类不能实例化!');
}
this.name = name;
this.viewPage = viewPage;
}
}
class UserFactory extends User {
constructor(name, viewPage) {
super(name, viewPage)
}
create(role) {
switch (role) {
case 'superAdmin':
return new UserFactory( '超级管理员', ['首页', '通讯录', '发现页', '应用数据', '权限管理'] );
break;
case 'admin':
return new UserFactory( '普通用户', ['首页', '通讯录', '发现页'] );
break;
case 'user':
return new UserFactory( '普通用户', ['首页', '通讯录', '发现页'] );
break;
default:
throw new Error('参数错误, 可选参数:superAdmin、admin、user')
}
}
}
let userFactory = new UserFactory();
let superAdmin = userFactory.create('superAdmin');
let admin = userFactory.create('admin');
let user = userFactory.create('user');
抽象工厂模式
抽象工厂模式是通过对类的工厂抽象使其业务用于对于产品类簇的创建,而不负责创建某一类产品的实例
function getAbstractUserFactory (type) {
switch(type) {
case 'wechat':
return UserOfWechat;
case 'qq':
return UserOfQq;
case 'weibo':
return UserOfWeibo;
default:
throw new Error('参数错误,可选参数:superAdmin, admin, user')
}
}
let WechatUserClass = getAbstractUserFactory('wechat');
let QqUserClass = getAbstractUserFactory('qq');
let WeiboUserClass = getAbstractUserFactory('weibo');
let wechatUser = new WechatUserClass('微信小李');
let qqUser = new QqUserClass('QQ小李');
let weiboUser = new WeiboUserClass('微博小李');
关于工厂模式的学习是在学习vuex源码的时候,关于this.options.state这里面要用工厂模式