引言
在面向对象编程中, 最通常的方法是通过new操作符产生一个对象实例,但是如果我们把这些创建对象的工作都放到客户端代码中完成,那么后期代码的维护和修改就会变得很复杂,为了解决这些问题,通过建立工厂来完成对象的创建。
描述
在工业革命之前,没有出现工厂,我们如果需要一张八仙桌的话,可能的做法是自己造一张。
简单工厂模式:有了一家生产桌子的工厂,该工厂不仅可以生产八仙桌,还能生产圆桌等。只需要告诉工厂,我要一张八仙桌,那么工厂会替我们生产,只要拿过来使用就可以。
工厂方法模式:现在工厂成为一个抽象的概念,它底下有八仙桌工厂、圆桌工厂等来生产具体的产品。如果我们需要八仙桌的话,得具体指定八仙桌工厂来为我们生产八仙桌。
抽象工厂模式:现在我们不仅想要八仙桌还想要太师椅,工厂只能生产桌子满足不了我们的要求,所以需要添加椅子的生产,同样,不仅可以生产太师椅还能生产其他的椅子。
简单工厂
Simple Factory:建立一个工厂(一个函数或一个类方法)来制造新的对象。 又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。可以看作工厂方法模式的一种特例,两者归为一类。
优点
从名字上就可以知道,这个模式很简单。工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
缺点
工厂类集中了所有实例的创建逻辑,不符合高内聚,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。违背了开放-封闭原则。
使用场景
工厂类负责创建的对象比较少; 客户只知道传入工厂类的参数, 一般只在很简单的情况下应用。
工厂方法
Factory Method:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
优点
和简单工厂相比,工厂方法符合开放-封闭原则,既保持了简单工厂的优点,又克服了它的缺点。
缺点
每增加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。使用场景
第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,而不需要知道对象的创建过程。第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
抽象工厂
Abstract Factory:提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
优点
易于交换产品系列。
缺点
难以支持新种类的产品。
使用场景
系统中有多个产品族。
联系
从简单工厂到工厂方法再到抽象工厂,这三种模式逐步抽象,并且更具一般性。
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。一个具体工厂类。
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别
简单工厂模式只有一个抽象产品类,并且没有抽象工厂。
工厂方法模式只有一个抽象产品类,和简单工厂相比,拥有抽象工厂。
抽象工厂模式有多个抽象产品类,并且具有抽象工厂。
小结
文章开头的部分,桌子和椅子的例子是当时自己的理解,可能不是很合适,如果理解有错误或者不恰当还请大家指出来。