小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
一、简单工厂模式
定义:定义了一个创建对象的类,由这个类来封装实例化对象的行为。
理解: 简单工厂模式就是提供了一个工厂专门负责创建对象,包含三个角色,工厂角色负责实现创建所有实例的内部逻辑,是简单工厂模式的核心;抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口;具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。当你需要什么,就传入一个正确的参数,就可以获取到所需的对象,不用知道知道其中的细节。
优点: 对象的创建和使用分离,不用关心其内部实现。客户端只需要知道创建具体产品的类名。可以引入配置文件,不修改客户端代码跟换其他产品。
缺点: 违反了开闭原则,当有新的产品需要增加的时候,就不得不修改工厂类来实现。当产品很多的时候,工厂就会变得很复杂,很多逻辑判断,系统性能变差。
场景: 工厂类负责创建的对象比较少,对象较少,工厂方法中的业务逻辑就不会太过复杂。
客户端只知道传入工厂类的参数,对于如何创建对象不关心。
二、工厂方法模式
定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
理解: 工厂方法模式就不在提供一个统一的工厂来创建所有的产品,而是由具体的工厂来创建具体的产品。工厂方法模式包含四个角色,抽象工厂提供了创建产品的接口,客户端通过它来访问具体工厂来创建产品;具体工厂实现抽象工厂的抽象方法,主要完成具体产品的创建;抽象产品定义了产品的功能;具体产品实现抽象产品的接口,由具体工厂创建;当创建产品只需要知道产品对应的工厂就行。
优点: 更符合开闭原则,相比简单工厂模式灵活性增强了,增加产品只需增加一个工厂类。符合第一职责原则,每个工厂只负责创建对应的产品。
缺点: 产品多的情况下,创建的工厂类多,增加了系统复杂性。在客户端使用抽象层定义,增加了抽象性和理解难度,实现时可能用到DOM、发射等技术,增加系统实现难度。****
场景: 客户端不知道具体产品是什么,只知道对应的工厂是哪个。客户不关心产品的具体实现细节,只关心创建的产品。抽象工厂提供一个创建产品的接口,而让其具体子工厂来完成创建。****
三、抽象工厂模式
定义: 为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。
理解: 产品等级,例如一个抽象类的电视机,子类有TCL电视机、海尔电视机等,抽象电视机与具体品牌的电视机构成一个产品等级。在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,例如海尔工厂生产海尔电视机、海尔电冰箱、海尔空调,这些同品牌不同产品位于一个产品族,海尔电视机和其他品牌电视机位于一个产品等级结构。抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,不用指定它们具体的类。抽象工厂模式包含四个角色,抽象工厂提供创建产品的接口,接口中包含多个产品的方法,可以创建不同等级的产品;具体工厂事项抽象工厂的方法,负责创建具体产品;抽象产品定义描述查产品的功能,可以有多个抽象产品;具体产品实现抽象产品接口,由具体工厂创建,具体工厂可以创建不同等级具体产品;
优点: 增加一个产品族时,不用修改代码,增强程序扩展性。抽象工厂模式可以保证客户端每次只使用其中一个产品族。
缺点: 当需要增加一个新的产品时,比较麻烦需要对系统进行修改,违反开闭原则。
场景: 创建的对象是一系列有相关性的产品族,例如电视机、空调、冰箱等。系统中有多个产品族,但是每次只使用其中一族,例如有的人只喜欢用XX品牌的产品。