关于前端:设计模式之抽象工厂

36次阅读

共计 3069 个字符,预计需要花费 8 分钟才能阅读完成。

形象工厂模式铜工厂办法模式一样,也是有形象工厂、具体工厂、形象产品、具体产品 4 个因素形成,然而形象工厂中办法个数不同, 形象产品的个数也不同。那么这篇文章次要介绍一下形象工厂。

说到形象工厂不晓得有没有些许的迷茫,笔者在刚刚接触的时候却是很迷茫的,其中最难了解的可能就是 形象。什么是形象?

形象:形象是从泛滥的事物中抽取出独特的、本质性的特色,而舍弃其非本质的特色的过程。具体地说,形象就是人们在实际的根底上,对于丰盛的理性资料通过去粗取精、去伪存真、由此及彼、由表及里的加工制作,造成概念、判断、推理等思维模式,以反映事物的实质和法则的办法。——节选自百度百科

笔者的了解的形象则是抽离实物的实质,去掉其中不中要的局部。心愿大家也能对形象有一个简略的了解,既然了解了形象,那么形象工厂模式天然也是如此,文章中结尾说到形象工厂模式铜工厂办法模式一样,其实也不大雷同,其实形象工厂模式是工厂办法模式的降级版本,工厂办法模式只生产一个等级的产品,而形象工厂模式可生产多个等级的产品。

什么是形象工厂模式

形象工厂模式:是一种为拜访类提供一个创立一组相干或相互依赖对象的接口,且拜访类毋庸指定所要产品的具体类就能失去同族的不同等级的产品的模式构造。然而笔者了解的形象工厂是这样的,为创立一组相干或依赖的对象提供一个接口,而且无需指定他们的具体类。

应用形象工厂模式个别要满足以下条件。

  1. 零碎中有多个产品族,每个具体工厂创立同一族但属于不同等级构造的产品。
  2. 零碎一次只可能生产其中某一族产品,即同族的产品一起应用。

形象工厂定义了用于创立不同产品的接口,但将理论的创立工作留给了具体工厂类。每个工厂类型都对应一个特定的产品变体。在创立产品时,客户端代码调用的是工厂对象的构建办法,而不是间接调用构造函数 (new 操作符)。因为一个工厂对应一种产品变体,因而它创立的所有产品都可互相兼容。客户端代码仅通过其形象接口与工厂和产品进行交互。该接口容许同一客户端代码与不同产品进行交互。你只需创立一个具体工厂类并将其传递给客户端代码即可。

形象工厂模式优缺点

形象工厂更像一个简单版本的策略模式,策略模式通过更换策略来扭转解决形式或者后果;而形象工厂的客户端,通过更改工厂还扭转后果。所以在应用的时候,就应用客户端和更换工厂,而看不到产品自身。

工厂办法目标是生产产品,所以能看到产品,而且还要应用产品。当然,如果产品在创建者外部应用,那么工厂办法就是为了欠缺创建者,从而能够应用创建者。另外创建者自身是不能更换所生产产品的。

长处

  1. 能够在类的外部对产品族中相关联的多等级产品独特治理,而不用专门引入多个新的类来进行治理
  2. 当须要产品族时,形象工厂能够保障客户端始终只应用同一个产品的产品组
  3. 减少新的产品更加容易,形象工厂加强了程序的可扩展性,当减少一个新的产品族时,不须要批改原代码

毛病

  1. 当产品族中须要减少一个新的产品时,所有的工厂类都须要进行批改
  2. 减少了零碎的抽象性和了解难度

示例

形象工厂模式的次要角色如下:

  1. 形象工厂:提供了创立产品的接口,它蕴含多个创立产品的办法newProduct(),能够创立多个不同等级的产品。
  2. 具体工厂:次要是实现形象工厂中的多个形象办法,实现具体产品的创立。
  3. 形象产品:定义了产品的标准,形容了产品的次要个性和性能,形象工厂模式有多个形象产品。
  4. 具体产品:实现了形象产品角色所定义的接口,由具体工厂来创立,它同具体工厂之间是多对一的关系。

类图如下所示:

代码示例:

// 形象产品 A 接口
interface AbstractProductA {}
// 形象产品 B 接口
interface AbstractProductB {}

// 形象工厂接口
interface AbstractFactory {createProductA() : AbstractProductA;
    createProductB() : AbstractProductB;}

// 具体工厂 1
class ConcreteFactory1 implements AbstractFactory {constructor() {}
    public createProductA() : AbstractProductA {return new ConcreteProductA1();
    }
    public createProductB() : AbstractProductB {return new ConcreteProductB1();
    }
}

// 具体工厂 2
class ConcreteFactory2 implements AbstractFactory {constructor() {}
    public createProductA() : AbstractProductA {return new ConcreteProductA2();
    }
    public createProductB() : AbstractProductB {return new ConcreteProductB2();
    }
}

// 具体产品 A1
class ConcreteProductA1 implements AbstractProductA {}
// 具体产品 A2
class ConcreteProductA2 implements AbstractProductA {}
// 具体产品 B1
class ConcreteProductB1 implements AbstractProductB {}
// 具体产品 B2
class ConcreteProductB2 implements AbstractProductA {}

// 应用
const factory1 : AbstractFactory = new ConcreteFactory1();
const factory2 : AbstractFactory = new ConcreteFactory2();
const productA1 : AbstractProductA = factory1.createProductA();
const productA2 : AbstractProductA = factory2.createProductA();
const productB1 : AbstractProductB = factory1.createProductB();
const productB2 : AbstractProductB = factory2.createProductB();

形象工厂与工厂办法不同

  1. 形象工程关键在于产品之间的形象关系,所以至多要两个产品;工厂办法在于生成产品,不关注产品间的关系,所以能够只生成一个产品。
  2. 形象工厂中客户端把产品的形象关系理分明,在最终应用的时候,个别应用客户端,产品之间的关系是被封装固定的;而工厂办法是在最终应用的时候,应用产品自身。
  3. 形象工厂的工厂是类;工厂办法的工厂是办法。

形象工厂的工厂类就做一件事件生产产品。生产的产品给客户端应用,绝不给本人用。工厂办法生产产品,能够给零碎用,能够给客户端用,也能够本人这个类应用。本人这个类除了这个工厂办法外,还能有其余功能性的办法。

给工厂办法模式加一个客户端,除了客户端都不必这个创建者。这个时候创建者就是工厂类了。然而形象工厂模式中,在客户端外部编程时候,就能够把工厂类当作创建者。

总结

形象工厂模式的扩大有肯定的 开闭准则 歪斜性,当减少一个新的产品族时只需减少一个新的具体工厂,不须要批改原代码,满足开闭准则。当产品族中须要减少一个新品种的产品时,则所有的工厂类都须要进行批改,不满足开闭准则。另一方面,当零碎中只存在一个等级构造的产品时,形象工厂模式将进化到工厂办法模式。

正文完
 0