2021-11-16 - 学习记录

2021-11-17  本文已影响0人  张中华
  1. 设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型

设计模式:工厂模式

简单工厂

/*
 * @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();
上一篇 下一篇

猜你喜欢

热点阅读