也叫 虚拟构造函数、Virtual Constructor、Factory Method
工厂方法是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。
适合应用场景
1.当你在编写代码的过程中,如果无法预知对象确切类别及其依赖关系时,可使用工厂方法。
工厂方法将创建产品的代码与实际使用产品的代码分离,从而能在不影响其他代码的情况下扩展产品创建部分代码。例如,如果需要向应用中添加一种新产品,你只需要开发新的创建者子类,然后重写其工厂方法即可。
2.如果你希望用户能扩展你软件库或框架的内部组件,可使用工厂方法。继承可能是扩展软件库或框架默认行为的最简单方法。但是当你使用子类替代标准组件时,框架如何辨识出该子类?解决方案是将各框架中构造组件的代码集中到单个工厂方法中,并在继承该组件之外允许任何人对该方法进行重写。
3。如果你希望复用现有对象来节省系统资源,而不是每次都重新创建对象,可使用工厂方法。在处理大型资源密集型对象(比如数据库连接、文件系统和网络资源)时,你会经常碰到这种资源需求。
优缺点
优点:你可以避免创建者和具体产品之间的紧密耦合。
单一职责原则。你可以将产品创建代码放在程序的单一位置,
从而使得代码更容易维护。
开闭原则。无需更改现有客户端代码,你就可以在程序中引
入新的产品类型。
缺点:应用工厂方法模式需要引入许多新的子类,代码可能会因此
变得更复杂。最好的情况是将该模式引入创建者类的现有层
次结构中。
亦称:Abstract Factory
抽象工厂是一种创建型设计模式,它能创建一系列相关的对象,而无需指定其具体类。
适合应用场景
如果代码需要与多个不同系列的相关产品交互,但是由于无法提前获取相关信息,或者出于对未来扩展性的考虑,你不希望代码基于产品的具体类进行构建,在这种情况下,你可以使用抽象工厂。
抽象工厂为你提供了一个接口,可用于创建每个系列产品的对象。只要代码通过该接口创建对象,那么你就不会生成与应用程序已生成的产品类型不一致的产品。如果你有一个基于一组抽象方法的类,且其主要功能因此变得不明确,那么在这种情况下可以考虑使用抽象工厂模式。在设计良好的程序中,每个类仅负责一件事。如果一个类与多种类型产品交互,就可以考虑将工厂方法抽取到独立的工厂类或具备完整功能的抽象工厂类中。如果你有一个基于一组抽象方法的类,且其主要功能因此变得不明确,那么在这种情况下可以考虑使用抽象工厂模式。在设计良好的程序中,每个类仅负责一件事。如果一个类与多种类型产品交互,就可以考虑将工厂方法抽取到独立的工厂类或具备完整功能的抽象工厂类中。
优缺点
优点:你可以确保同一工厂生成的产品相互匹配。
你可以避免客户端和具体产品代码的耦合。
单一职责原则。你可以将产品生成代码抽取到同一位置,使
得代码易于维护。
开闭原则。向应用程序中引入新产品变体时,你无需修改客
户端代码。
缺点:由于采用该模式需要向应用中引入众多接口和类,代码可能
会比之前更加复杂
亦称:建造者模式、Builder
生成器是一种创建型设计模式,
使你能够分步骤创建复杂对象。
该模式允许你使用相同的创建
代码生成不同类型和形式的对象。