# 工厂模式
# 概念:
定义:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
何时使用:我们明确地计划不同条件下创建不同实例时。
# 作用:
主要解决接口选择的问题。
# 特点:
优点
- 创建对象的过程可能很复杂,但我们只需要关心创建结果。
- 构造函数和创建者分离, 符合“开闭原则”
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
缺点
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
# 应用场景:
当需要依赖具体环境创建不同的实例,这些实例都有相同或相似的行为,这时候可以使用工厂模式。
# 例子
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);