简单工厂模式
let Basketball = function () {
this.intro = '篮球';
}
Basketball.prototype = {
getMember: function () {
console.log('每个队伍需要5名队员');
}
}
let Football = function () {
this.intro = '足球';
}
Basketball.prototype = {
getMember: function () {
console.log('每个队伍需要11名队员');
}
}
function sportsFactory(name) {
switch (name) {
case: 'basketball'
return new Basketball();
case: 'football'
return new Football();
}
}
function createBook(name, time, type) {
let o = new Object();
o.name = name;
o.time = time;
o.type = type;
o.getName = function () {
console.log(this.name);
}
return o;
}
- 第一种工厂模式,所有的类实例都会共享原型上共有的方法和属性
- 第二种工厂模式每次返回的都是独立的个体,不存在相互影响
工厂方法模式
安全模式类
- 在类中判断this指向,若是指向全局对象,就返回一个Demo类的实例
let Demo = function () {
if (!(this instanceof Demo)) {
return new Demo();
}
}
Demo.prototype = {
say: function () {
console.log('hello world');
}
}
let demo = Demo();
demo.say();//hello world
安全的工厂方法
- 若以后还有新的需求,可以在Factory的原型对象上添加方法
- 同时,这也是安全的工厂模式
function Factory(type, content) {
if (!(this instanceof Factory)) {
return new Factory[type](content);
} else {
return new Factory(type, content);
}
}
Factory.prototype = {
Java: function (content) { },
JavaScript: function (content) { }
}
抽象工厂模式
function CarFactory(SubClass, name) {
if (typeof this[name] === 'function') {
function F() { }
F.prototype = new CarFactory[name]();
SubClass.contructor = SubClass;
SubClass.prototype = new F();
} else {
throw new Error('不是抽象类');
}
}
CarFactory.Car = function () {
this.type = 'Car';
}
CarFactory.Car.prototype = {
getSpeed: function() {
return new Error('抽象方法');
}
}
function BWW(speed) {
this.speed = speed;
}
CarFactory(BWM, 'Car');
BWM.prototype.getSpeed = function () {
console.log(this.speed);
}