# 工厂模式

# 概念:

​ 定义:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

​ 何时使用:我们明确地计划不同条件下创建不同实例时。

# 作用:

​ 主要解决接口选择的问题。

# 特点:

​ 优点

  • 创建对象的过程可能很复杂,但我们只需要关心创建结果。
  • 构造函数和创建者分离, 符合“开闭原则”
  • 一个调用者想创建一个对象,只要知道其名称就可以了。
  • 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。

​ 缺点

​ 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

# 应用场景:

​ 当需要依赖具体环境创建不同的实例,这些实例都有相同或相似的行为,这时候可以使用工厂模式。

# 例子

​ JQuery的$()就是一个工厂函数,它根据传入参数的不同创建元素或者去寻找上下文中的元素,创建成相应的jQuery对象。

class jQuery {
    constructor(selector) {
        super(selector)
    };
    add() {
        
    };
  // 此处省略若干API
};

window.$ = function(selector) {
    return new jQuery(selector);
};

# 编码实现:

/**
 * @title : 工厂模式 Factory 。
 */

class FruitFactory {
	constructor() {
		this.Apple = new Apples();
		this.Orange = new Oranges();
		this.Banana = new Bananas();
		this.Watermelon = new Watermelon();
	};

	getFactory(name) {
		return this[name];
	};
};

class Apples {
	constructor() {
		this.color = 'red';
		this.size = 200;
	};
};

class Oranges {
	constructor() {
		this.color = 'yellow';
		this.size = 80;
	};
};

class Bananas {
	constructor() {
		this.color = 'yellow';
		this.size = 120;
	};
};

class Watermelon {
	constructor() {
		this.color = 'green';
		this.size = 1000;
	};
};


// 初始化工厂。
const fruitFactory = new FruitFactory();

const Banana = fruitFactory.getFactory('Banana');
console.log(Banana.color, Banana.size);

const Watermelon1 = fruitFactory.getFactory('Watermelon');
console.log(Watermelon1.color, Watermelon1.size);