抽象工厂(creational 2)

238 阅读1分钟

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')
	})
})