工厂模式 gaunthan Posted on Jan 18 2017 ? Design Patterns ? > 所有工厂模式都用来封装对象的创建,使应用程序解耦,并降低其对特定实现的依赖。 <!--more--> ## 简单工厂* **简单工厂**不是一个设计模式,反而比较像是一种编程习惯。它通过提供一个创建方法,将与创建对象有关的细节封装起来,以隔离变化。 看起来简单工厂只是将问题搬到另一个对象?其实这种说法是不正确的。通过提供多一层封装,就使得改变因素集中在这个方法的内部。简单工厂其实是一个简单的封装而已,但在某些情况下也能一展身手。 在某些地方你可能会看到这个方法被定义为静态的,在这种情况,它被称为静态工厂[^static factory methods]。 [^static factory methods]: [Effective Java: 使用静态工厂方法](http://hellojinjie.com/2014/04/03/effective-java%EF%BC%9A%E4%BD%BF%E7%94%A8%E9%9D%99%E6%80%81%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95/) ## 工厂方法模式 > **工厂方法模式**(Factory Method Pattern)定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。 ### 概述 工厂方法模式通过让子类决定该创建的对象是什么,来达到封装对象创建的过程的目的。这里的“决定”指的是在编写创建者类时,不需要知道实际创建的产品是哪一个,而不是指模式允许子类在运行时做决定。 工厂方法模式将创建对象的代码集中在一个对象或方法中,可以避免代码重复,而且更方便维护。这意味着客户在实例化对象时,只会依赖于接口,而不是具体类。这让代码更具有弹性,可以应对未来的扩展。 ### 结构 工厂方法模式的类图如下所示:  说明如下: |组成成分|说明| |--| |Creator|一个类,实现了所有操作产品的方法,但不实现工厂方法。| |ConcreteCreator|Creator的子类,必须实现抽象的工厂方法`factoryMethod()`,以实际制造出产品。| |Product|所有的产品都必须实现的接口。这样一来,使用这些产品的类就可以引用这个接口,而不是具体类。| |ConcreteProduct|具体产品,只有ConcreteCreator类知道如何创建这些产品。| ## 抽象工厂模式 > **抽象工厂模式**(Abstract Factory Pattern)提供一个接口,用户创建相关或依赖对象的家族,而不需要明确指定具体类。 ### 概述 抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品是什么。这样一来,用户就从具体的产品中被解耦。 ### 结构 抽象工厂模式可用以下UML图来表示:  **抽象工厂的方法经常以工厂方法的方式实现**。抽象工厂的任务是定义一个负责创建一组产品的接口,这个接口内的每个方法都负责创建一个具体产品,同时我们利用实现抽象工厂的子类来提供这些具体的做法。所以,在抽象工厂中利用工厂方法实现生产方法是理所当然的做法。 ## 总结 |论点|工厂方法|抽象工厂| |--| |实现方式|工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。|抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中。| |作用|工厂方法允许类将实例化延迟到子类进行。|抽象工厂创建相关的对象家族,而不需要依赖它们的具体类。| ## References - 弗里曼弗里曼谢拉贝茨 O'ReillyTaiwan 公司 UMLChina. Head First 设计模式 [M]. 中国电力出版社, 2007. 赏 Wechat Pay Alipay 单件模式 索引查找