四、工厂模式

1. 简单工厂

一个实现了简单工厂的UML类图:(简单工厂


说明
   1、客户通过在PizzaStore通过SimplePizzaFactory取得Pizza的实例。
   2、SimplePizzaFactory是应用中唯一用到具体Pizza产品的地方
   3、Pizza定义为抽象类,具有一些有用的实现(但不是必须的),这些实现也可以被覆盖
   4、CheesePizza、VeggiePizza、CalmPizza、PepperonPizza 是具体的Pizza实现。每个产品必须实现Pizza接口,并设计成具体类。这样一来,就可以被工厂创建,并返回给客户
个人理解:简单工厂其实不是设计模式,更像是一种编程习惯。

2.工厂方法

一个实现了工厂方法的UML类图:(工厂方法


定义:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
个人理解:简单工厂把全部的事情,在一个地方全部都处理完成了。然而工厂方法确是创建一个框架,让子类决定如何实现。比如说,在工厂方法中,orderPizza() 方法提供了一般的框架,以便创建pizza,orderPizza() 方法依赖工厂方法创建具体类,并创造出实际的pizza。可通过继承PizzaStore类,决定实际创造出的pizza是什么。简单工厂的做法,可已将对象的创建封装起来,但是简单工厂不具备工厂方法的弹性,因为简单工厂不能变更正在创建的产品。

3.抽象工厂

一个实现了抽象工厂的的UML类图:(抽象工厂


定义:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
个人理解:抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要关心实际生产出来的具体产品是什么。这样一来客户就从具体的产品中被解耦。
工厂方法对比抽象工厂:
1、抽象工厂和工厂方法都是负责创建对象(工厂方法用的是继承,抽象工厂用的是对象组合)。
2、整个工厂方法就是通过子类来创建对象。用这种做法,客户只需要知道他们所使用的抽象类型就可以了,而由子类负责决定具体类型。所以,工厂方法负责将客户从具体类型中解耦。(抽象工厂提供一个用来创建一个产品家族的抽象类型,这个类型由子类定义了产品被产生的方法。要想使用这个工厂,必须先实例化它,然后传入到一些针对抽象类所写的代码中。所以,和工厂方法一样,抽象工厂把客户从使用的具体产品中解耦)。
3、抽象工厂的优点是可以把一群相关的产品集合起来(如果这些相关的产品需要增加,那么就必须修改这个抽象,因为这是在创建一个大的产品家族)。
4、抽象工厂经常会使用工厂方法来实现具体的工厂(但是具体的工厂只是用来创建产品而已)。
5、对于工厂方法而言,抽象创建者中实现的代码经常会用到子类所创建的具体类型。
6、对于抽象工厂和工厂方法的使用上,如果想要创建产品家族或者让制造的相关产品集合起来,可以使用抽象工厂。
如果客户代码需要从实例化的具体类中解耦,或者目前而言不知道实例化那些具体类的时候,可以使用工厂方法(工厂方法的使用很简单,只要继承为子类,并覆盖相应的工厂方法就可以了)。

原文地址:https://www.cnblogs.com/huacesun/p/6622500.html