《JavaScript设计模式》——9.10 Factory(工厂)模式

9.10 Factory(工厂)模式

Factory模式是另一种创建型模式,涉及创建对象的概念。其分类不同于其他模式的地方在于它不显式地要求使用一个构造函数。而Factory可以提供一个通用的接口来创建对象,我们可以指定我们所希望创建的工厂对象的类型(见图9-9)。

假设有一个UI工厂,我们要创建一个UI组件的类型。不需要直接使用new运算符或者通过另一个创建型构造函数创建这个组件,而是要求Factory对象创建一个新的组件。我们通知Factory需要什么类型的对象(如“按钮”、“面板”),它会进行实例化,然后将它返回给我们使用。

如果对象创建过程相对比较复杂,这种方法特别有用,例如,如果它强烈依赖于动态因素或应用程序配置的话。

可以在ExtJS等UI库中找到此模式的示例,其中创建对象或组件的方法也有可能被归入子类了。

下面这个示例构建在之前的代码片段之上,使用Constructor模式逻辑来定义汽车。它展示了如何使用Factory模式来实现vehicle工厂:

// Types.js –本例构造函数的存放文件
// 定义Car构造函数

function Car(options) {
  // 默认值
  this.doors = options.doors || 4;
  this.state = options.state || "brand new";
  this.color = options.color || "silver";
}

// 定义Truck构造函数

function Truck(options) {
   this.state = options.state || "used";
   this.wheelSize = options.wheelSize || "large";
   this.color = options.color || "blue";
}

// FactoryExample.js
// 定义vehicle工厂的大体代码

function VehicleFactory() { }

// 定义该工厂factory的原型和试用工具,默认的vehicleClass是Car

VehicleFactory.prototype.vehicleClass = Car;

// 创建新Vehicle实例的工厂方法

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});

// 测试汽车是由vehicleClass的原型prototype里的Car创建的
// 输出: true

console.log(car instanceof Car);

// 输出: Car对象,color: "yellow", doors: 6,state:"brand new"

console.log(car);

在方法 1 中,我们修改了VehicleFactory实例来使用Truck类:

var movingTruck = carFactory.createVehicle({
                      vehicleType: "truck",
                      state: "like new",
                      color: "red",
                      wheelSize: "small"});

// 测试卡车是由vehicleClass的原型prototype里的Truck创建的
// 输出: true

console.log(movingTruck instanceof Truck);

// 输出: Truck对象,color :"red", state:"like new" ,wheelSize:"small"

console.log(movingTruck);

在方法2中,我们把VehicleFactory归入子类来创建一个构建Truck的工厂类:

function TruckFactory() { }
TruckFactory.prototype = new VehicleFactory();
TruckFactory.prototype.vehicleClass = Truck;
var truckFactory = new TruckFactory();
var myBigTruck = truckFactory.createVehicle({
                      state: "omg..so bad.",
                      color: "pink",
                      wheelSize: "so big"});

// 确认myBigTruck是由原型Truck创建的
// 输出: true

console.log(myBigTruck instanceof Truck);

// 输出:Truck对象,color: pink", wheelSize: "so big", state: "omg. so bad"

console.log(myBigTruck);

9.10.1 何时使用Factory模式
Factory模式应用于如下场景时是特别有用的:

当对象或组件设置涉及高复杂性时
当需要根据所在的不同环境轻松生成对象的不同实例时
当处理很多共享相同属性的小型对象或组件时
在编写只需要满足一个API契约(亦称鸭子类型)的其他对象的实例对象时。对于解耦是很有用的。
9.10.2 何时不应使用Factory模式
如果应用错误,这种模式会为应用程序带来大量不必要的复杂性。除非为创建对象提供一个接口是我们正在编写的库或框架的设计目标,否则我建议坚持使用显式构造函数,以避免不必要的开销。

由于对象创建的过程实际上是藏身接口之后抽象出来的,单元测试也可能带来问题,这取决于对象创建的过程有多复杂。

9.10.3 Abstract Factory(抽象工厂)
了解抽象工厂模式也是有用的,它用于封装一组具有共同目标的单个工厂。它能够将一组对象的实现细节从一般用法中分离出来。

应当使用抽象工厂模式的情况是:一个系统必须独立于它所创建的对象的生成方式,或它需要与多种对象类型一起工作。

既简单又容易理解的示例是车辆工厂,它定义了获取或注册车辆类型的方法。抽象工厂可以命名为AbstractVehicleFactory。抽象工厂将允许对像car或truck这样的车辆类型进行定义,具体工厂只需要实现履行车辆契约的类(如Vehicle.prototype.drive和Vehicle.prototype.breakDown)。

var AbstractVehicleFactory = (function () {
// 存储车辆类型
  var types = {};
  return {
       getVehicle: function ( type, customizations ) {
            var Vehicle = types[type];
            return (Vehicle) ? return new Vehicle(customizations) : null;
       },
       registerVehicle: function ( type, Vehicle ) {
            var proto = Vehicle.prototype;
            // 只注册实现车辆契约的类
            if ( proto.drive && proto.breakDown ) {
                  types[type] = Vehicle;
            }
            return AbstractVehicleFactory;
        }
  };
})();
// 用法:
AbstractVehicleFactory.registerVehicle( "car", Car );
AbstractVehicleFactory.registerVehicle( "truck", Truck );
// 基于抽象车辆类型实例化一个新car对象
var car = AbstractVehicleFactory.getVehicle( "car" , {
             color: "lime green",
             state: "like new" } );
// 同理实例化一个新truck对象
var truck = AbstractVehicleFactory.getVehicle( "truck" , {
                wheelSize: "medium",
                color: "neon yellow" } );
时间: 2024-09-12 10:58:27

《JavaScript设计模式》——9.10 Factory(工厂)模式的相关文章

【设计模式系列】--简单工厂模式

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现.简单来说,通过专门定义一个类来辅助创建其他类的实例,被创建的实例通常都具有共同的父类,今天这篇博文,小编主要简单的介绍一下简单工程模式,通过简单的demo一步一步进行讲解,希望对有需要的小伙伴有帮助,还请小伙伴们多多指教.

设计模式C#描述——抽象工厂模式

设计 设计模式C#描述--抽象工厂模式 阅读此文应先阅读简单工厂模式与工厂方法模式 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构.那么为了将消费这些产品对象的责任和创建这些产品对象的责任分开,可以引进抽象工厂模式.这样的话,消费产品的客户不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品. 采用抽象工厂模式设计出的系统类图如下. 从上图可以看到,抽象工厂模式设计到以下的角色: 抽象工厂

设计模式之二(简单工厂模式)

原文:设计模式之二(简单工厂模式) 前言 简单工厂模式根据提供的数据或者参数返回几个可能的类中的一个实例,说通俗点有点像面向对象编程中的多态性,一个基类,有多个派生类,在另外的调用程序中,根据参数来决定返回这个基类的哪个具体的派生类,返回值为基类类型,因为基类的引用可以指向派生类对象,而且这些所有的派生类都包含有基类的函数,也就是说派生类中有相同的函数,但是函数的实现可能不同. 下面我只是来演示一下简单工厂模式,代码不会太复杂.所以大家可以使用Submile Text工具. 使用方法博客文章链接

设计模式(一)工厂模式Factory(创建型)

设计模式一 工厂模式Factory          在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题

重温设计模式(四)——工厂模式

1.写在前面 这篇文章是我酝酿了近一个月的时间写出来的,我想在第一个模式上就写出工厂模式,却一直推迟到现在. 工厂模式,看似很容易,很常见,但是学习设计模式两年,我至今仍未能真正地充分理解工厂模式的意图.工厂模式好在哪,他究竟解决了什么问题,工厂还是不工厂,困扰了我整整两年. 从无模式,到为模式而模式,在到今天的重温设计模式.我已经记不清大多数模式的样式了,只记得一系列的设计原则,然后去思考模式的综合.但是工厂模式,至今我仍然难以理解. 写出这篇文章,更多的目的是为了抛砖引玉,希望大家能够多多指

设计模式解 -2(工厂模式)

设计模式一 工厂模式Factory          在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题

实例解析C++设计模式编程中简单工厂模式的采用_C 语言

简单工厂模式中专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.它又称为静态工厂方法模式,属于类的创建型模式. 简单工厂模式的UML类图 简单工厂模式的程序通过封装继承来降低程序的耦合度,设计模式使得程序更加的灵活,易修该,易于复用. 简单工厂是在工厂类中做判断,从而创造相应的产品. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例.   该模式中包含的角色及其职责   1.工厂(Creator)角色  

C# 设计模式系列教程-简单工厂模式_C#教程

1. 概述: 将一个具体类的实例化交给一个静态工厂方法来执行,它不属于GOF的23种设计模式,但现实中却经常会用到 2. 模式中的角色 2.1 工厂类(Simple Factory): 只包含了创建具体类的静态方法. 2.2 抽象产品(Product):定义简单工厂中要返回的产品. 2.3 具体产品(ConcreteProduct):具体产品. 3. 模式解读 3.1 简单工厂模式的一般化类图 3.2 简单工厂模式的代码实现 /// <summary> /// 简单工厂类,用sealed修饰,

Ruby中使用设计模式中的简单工厂模式和工厂方法模式_ruby专题

之前有看过<ruby设计模式>,不过渐渐的都忘记了.现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下. 简单工厂模式: # -*- encoding: utf-8 -*- #运算类 class Operation attr_accessor :number_a,:number_b def initialize(number_a = nil, number_b = nil) @number_a = number_a @number_b = number_b end d

以Java代码为例讲解设计模式中的简单工厂模式_java

1. 简单工厂模式简介简单工厂模式(Simple Factory),又被称为"静态工厂方法模式".它属于"创建模式"(创建对象的模式),并且是"工厂方法"模式的一种特殊实现. 通常,我们利用简单工厂模式来进行类的创建.例如,获取线程池对象,就是通过简单工厂模式来实现的.它的结构图如下所示: 工厂:工厂是简单工厂模式的核心,提供了对外接口.客户端或其它程序要获取Product对象,都是通过Factory的接口来获取的. 抽象产品:抽象产品是(许多)