• 工厂模式 详解


    定义

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类;

    创建类模式

    角色

    • 抽象工厂角色(AbstractFactory):模式的核心,提供具体工厂角色必须实现的接口或者必须继承的父类;
    • 具体工厂角色(ConcreteFactory):含有和具体业务逻辑有关的代码,由应用程序调用以创建对应的具体产品的对象;
    • 抽象产品角色(AbstractProduct): 负责具体产品角色的定义的接口或抽象类;
    • 具体产品角色(ConcreteProduct): 被具体工厂角色创建的对象;

    从网上找到的例图
    enter image description here


    适用场景

    • 当一个类不知道它所创建的对象的类的时候;
    • 当一个类希望由它的子类来指定它所创建的对象的时候;
    • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部话的时候;

    例子


    实现代码

    /**
     * Created by George on 16/7/3.
     */
    //汽车
    function Car(options) {
        this.doors = options.doors || 4;
        this.state = options.state || "new";
        this.color = options.color || "white";
    }
    
    //卡车类
    function Truck(options) {
        this.state = options.state || "used";
        this.wheelSize = options.wheelSize || "large";
        this.color = options.color || "blue";
    }
    
    // 工厂
    function VehicleFactory() {}
    // 定义该工厂factory的原型和试用工具,默认是car
    VehicleFactory.prototype.vehicleClass = Car;
    // 创建工厂方法
    VehicleFactory.prototype.createVehicle = function (options) {
        if (options.vehicleType === "car") {
            this.vehicleClass = Car;
        }
        else {
            this.vehicleClass = Truck;
        }
        return new this.vehicleClass(options);
    }
    
    //创建生成汽车的工厂实例
    var carFactory = new VehicleFactory();
    var car = carFactory.createVehicle({
        vehicleType : "car",
        color : "yellow",
        doors : 6,
    });
    console.log(car instanceof Car);
    console.log(car);
    
    //创建生成卡车的工厂实例
    var movingTruck = carFactory.createVehicle({
        vehicleType : "truck",
        state : "new",
        color : "red",
        wheelSize : "small",
    });
    console.log(car instanceof Truck);
    console.log(movingTruck);
    
    ///////////////////////////
    
    //将VehicleFactory归入子类来创建一个构建Truck的工厂类
    function TruckFactory() {}
    TruckFactory.prototype = new VehicleFactory();
    // 定义该工厂factory的原型和试用工具,默认是car
    TruckFactory.prototype.vehicleClass = Truck;
    
    var truckFactory = new TruckFactory();
    var bigTruck = truckFactory.createVehicle({
        state : "bad",
        color : "black",
        wheelSize : "big",
    });
    console.log(bigTruck instanceof Truck);
    console.log(bigTruck);
    
    

    实现结果:
    这里写图片描述


    优缺点

    1. 可以使代码结构清晰,有效地封装变化,降低耦合度。通过工厂模式,将产品的实例化封装起来,使得调用者根本无须关心产品的实例化过程,只需依赖工厂就可以得到自己想要的产品;
    2. 对调用者屏蔽具体的产品类,只关心产品的接口;
    3. 扩展性高,如果想要增加一个产品,只要扩展一个工厂类就可以;

    注意的是

    1. 每次增加一个产品的时候,都要增加一个具体类和对象实现工厂,使得系统中类的个数成倍的增加,在一定程度上增加了系统的复杂度,同时也增加系统具体类的依赖;
  • 相关阅读:
    十天冲刺个人博客四
    十天冲刺个人博客三
    十天冲刺个人博客二
    软件工程课堂七(单词统计)
    十天冲刺个人博客一
    软件工程第九周总结
    人月神话阅读笔记03
    软件工程课堂六(《飘》单词统计)
    软件工程第八周总结
    跨域
  • 原文地址:https://www.cnblogs.com/George1994/p/6037649.html
Copyright © 2020-2023  润新知