- 设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型
设计模式:工厂模式
简单工厂
/*
* @Author: zzh
* @Date: 2021-10-20 17:07:13
* @LastEditors: zzh
* @LastEditTime: 2021-11-16 13:42:10
* @FilePath: \origin\设计模式\simpleFactory.js
* @Description: 简单工厂方法
*/
/**
* 简单工厂方法:
* 简单工厂模式:又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。
* 工厂方法的核心,也是最简单的工厂方法
* 创建一个工厂,然后利用参数告知这个工厂,让其创建指定的对象
* 优点:解耦,把不同且功能相似的对象进行隔离,利用工厂统一管理
* 缺点:如果新增或者删除,影响到了工厂获取产品的方法,违背了开闭原则 -> 工厂方法模式
*/
class Car {
go() {
console.log('开车出门咯...');
}
}
class Bike {
go() {
console.log('骑自行车出门咯...');
}
}
class SimpleFactory {
getVehicle (vehicle) {
switch (vehicle) {
case 'car': return new Car();
case 'bike': return new Bike();
// ..., 可能还有很多其他交通工具
}
}
}
// 测试
const factory = new SimpleFactory(); // 先获取工厂示例,这里使用静态方法,直接获取交通工具
const myVehicle = factory.getVehicle('bike'); // 获取想要的出行工具
myVehicle.go(); // 出发
工厂方法
/**
* 继简单工厂之后,我们知道,简单工厂模式在新增、修改、删除时会对工厂产生一定的影响,违背了开闭原则,那么工厂方法便解决了这一问题
* 工厂方法模式的本意就是将实际创建对象的工作推迟到子类中,所以我们可以将工厂方法看作是一个实例化对象的工厂类。
* 角色:抽象工厂,具体工厂,抽象产品,具体产品
*
*/
// 因为js没有接口的概念,所以不需要创建抽象工厂
class Car {
go() {
console.log('开车出门咯...');
}
}
class Bike {
go() {
console.log('骑自行车出门咯...');
}
}
// 新增:class XXXX {}
// ....
class Factory {
getVehicle(type) {
return this[type];
}
}
Factory.prototype.Car = new Car();
Factory.prototype.Bike = new Bike();
// 新增:Factory.prototype.XXX = new XXX();
// ...
// 测试
const factory = new Factory();
const myVehicle = factory.getVehicle('Bike');
myVehicle.go();
抽象工厂
/**
* 工厂方法解决的是一个工厂针对一种类型的系列产品,
* 那么如果是一个工厂,里面有多种系列产品呢?例如汽车,自行车;手机,mp3;衣服,帽子等;
* 当然可以使用多个工厂方法,如果在一个工厂里面该如何解决呢?
*
*/
class Car {
go() {
console.log('开车出门咯...');
}
}
class Bike {
go() {
console.log('骑自行车出门咯...');
}
}
// 新增:class XXXX {}
// ....
class Phone {
start() {
console.log('打开手机...');
}
}
class Mp3 {
start() {
console.log('打开MP3...');
}
}
// 新增:class XXXX {}
// ....
class Factory {
getVehicle(type, product) {
return this[type][product];
}
}
Factory.prototype.vehicle = {};
Factory.prototype.vehicle.Car = new Car();
Factory.prototype.vehicle.Bike = new Bike();
// 新增:Factory.prototype.XXX = new XXX();
// ...
Factory.prototype.electronic = {};
Factory.prototype.electronic.Phone = new Phone();
Factory.prototype.electronic.Mp3 = new Mp3();
// 新增:Factory.prototype.YYYY = new YYYY();
// ...
// 测试
const factory = new Factory();
const myVehicle = factory.getVehicle('vehicle', 'Bike');
myVehicle.go();
const myElectronic = factory.getVehicle('electronic', 'Phone');
myElectronic.start();
网友评论