设计模式(三)工厂模式

创建型

定义

定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的**“创建与使用相分离”**的特点。

简单点来说就是,工厂模式不对外暴露具体创建对象的内部处理逻辑,而是提供一个方法来创建对象实例。该模式最直观的效果就是,创建对象实例时不直接使用new,而是调用一个方法。

工厂模式按照
按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。

我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”。

简单工厂模式

class Creator {
	create(fn, ...args) {
		if (fn == Person) {
			return new Person(...args);
		} else {
			return new Animal(...args);
		}
	}
}

class Animal {
	constructor(name) {
		this.name = name;
	}
}
class Person {
	constructor(name, age) {
		this.name = name;
		this.age = age;
	}
}

const creator = new Creator();

const p = creator.create(Person, "ff", 18);
const a = creator.create(Animal, "tiger");

工厂方法模式

工厂方法模式,就是在简单工厂模式的基础上优化了一下。
因为简单工厂模式适合 对象类 不多的场景,如果对象类种类多了,对于简单工厂来说就增加了比较冗余的对象判断。

function Factory(){
	let subClasses = {
	// 在这里添加、删除构造函数
		Animal: function (name) {
			this.name = name;
		},

		Person: function (name, age) {
			this.name = name;
			this.age = age;
		},
	};

	return class {
		constructor(fn, ...args) {
			if (subClasses.hasOwnProperty(fn)) {
				return new subClasses[fn](...args);
			} else {
				console.log(`class ${fn} not exits`);
			}
		}
	};
}
const creator = Factory();
console.log(new creator("Person", "jj", 9));
console.log(new creator("Cat", "jj", 9));

抽象工厂模式

抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

转化为简单语言就是,抽象工厂模式是可以同时创建多个相关对象实例

// 抽象工厂方法
function Factory() {}

// 子类工厂都会有的方法
Factory.prototype.touch = function () {
	console.log("touch");
};

// 创建对象的接口
Factory.create = function (type) {
	let args = [].slice.call(arguments, 1);
	let result = null;
	if (Factory.prototype[type] == undefined) {
    throw Error("type is not exist!");
	}
  // 子类是否继承了父类
  // Factory.prototype[type].prototype 子类构造函数的原型对象
  if(Factory.prototype[type].prototype.__proto__ !== Factory.prototype){
    // 没有则 让子类继承父类
    Factory.prototype[type].prototype = new Factory();
    // 增强子类,让子类实例 对象的原型 constructor指回子类构造函数本身
    Factory.prototype[type].prototype.__proto__.constructor = Factory.prototype[type];
  }
  // 创建子类
  result = new Factory.prototype[type](...args);
	return result;
};

// 子类工厂
Factory.prototype.Person = function (name, age) {
	this.name = name;
	this.age = age;
};

Factory.prototype.Animal = function (name) {
	this.name = name;
};

const p = Factory.create("Person",'ff',98);
console.log(p.__proto__ == Factory.prototype.Person.prototype); // true
console.log(p.__proto__.constructor == Factory.prototype.Person); // true

总结

暂时就知道这么多了,着重掌握一下抽象工厂模式吧。很多思想可能暂时用不太好,这种东西需要自己刻意的去注意、去培养,在合适的地方使用。我是边学习边记录,这些都是个人学习的记录,有不对的地方可以一起交流~
加油吧~
下次写 代理模式吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值