1.2 抽象工厂(abstract-factory)
- 定义了一个接口用于创建相关或有依赖关系的对象族,而无需明确指定具体类。
- 解决了工厂方法模式的问题:在抽象工厂中只需要传入参数就可以实例化不同类型的工厂对象。
//机器人工厂
function droidProducer(kind) {
if (kind === 'battle') return battleDroidFactory;
return pilotDroidFactory;
}
function battleDroidFactory() {
return new B1();
}
function pilotDroidFactory() {
return new Rx24();
}
function B1() {}
B1.prototype.info = function() {
return "B1, Battle Droid";
};
function Rx24() {}
Rx24.prototype.info = function() {
return "Rx24, Pilot Droid";
};
module.exports = droidProducer;
测试用例
const expect = require('chai').expect
const droidProducer = require('../src/creational/abstract-factory/abstract-factory');
describe('抽象工厂测试', () => {
it('战斗机器人', () => {
const battleDroid = droidProducer('battle')()
expect(battleDroid.info()).to.equal('B1,Battle Droid')
})
it('飞行机器人', () => {
const pilotDroid = droidProducer('pilot')()
expect(pilotDroid.info()).to.equal('Rx24,Pilot Droid')
})
})
es6 实现
function droidProducer(kind) {
if (kind === 'battle') return battleDroidFactory;
return pilotDroidFactory;
}
function battleDroidFactory() {
return new B1();
}
function pilotDroidFactory() {
return new Rx24();
}
class B1 {
info() {
return "B1, Battle Droid";
}
}
class Rx24 {
info() {
return "Rx24, Pilot Droid";
}
}
export default droidProducer;
const expect = require('chai').expect
import droidProducer6 from '../src/creational/abstract-factory/abstract-factory_es6';
describe('抽象工厂es6 测试', () => {
it('战斗机器人 es6', () => {
const battleDroid = droidProducer6('battle')()
expect(battleDroid.info()).to.equal('B1, Battle Droid')
})
it('飞行机器人 es6', () => {
const pilotDroid = droidProducer6('pilot')()
expect(pilotDroid.info()).to.equal('Rx24, Pilot Droid')
})
})