简单工厂模式(Sample Factory)
定义:又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
角色解释:
工厂(Creator)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
抽象产品(Product)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
例子:想要吃饭可以直接找一个小饭店,小饭店可以负责做出许多种饭菜,这个时候你是工厂角色,小饭店是抽象产品,饭菜是具体产品。
优点:工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实例化类,对于客户端来说,去除了与具体产品的依赖。
缺点:但是如果要新增加功能,需要在原有的运算工厂类的方法里加case分支条件,修改原有的类,违背了开放——封闭原则。
工厂方法模式(Abstract Factory)
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
角色:抽象工厂(Creator)角色是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口
例子:你还是去饭店吃饭,这个时候饭店里面分为了不同的窗口,窗口之间都是被人承包的,你想吃饺子是在一个窗口,想吃面条是另一个窗口,他们之间没有多大的联系,但是都和整个大的食堂有关。
特点:工厂方法把简单工厂的内部逻辑判断移动到了客户端代码来进行,简单工厂是修改工厂类,现在是修改客户端。其实也就是简单工厂的更加抽象性。
优点:克服了简单工厂违背开放——封闭原则的缺点,又保持了封装对象创建过程的优点。降低了客户程序与产品对象的耦合。
缺点:每增加一个产品,需要加一个工厂的类,增加额外开发量。
抽象工厂模式(Abstract Factory)
定义:提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
例子:蔬菜和水果是两个抽象产品,其中水果中的北方水果,热带水果;蔬菜中的北方蔬菜,热带蔬菜是具体实现。
优点:易于交换产品系列;具体的创建实例过程与客户端分开,客户端是通过抽象接口操作的。
缺点:不能很好的实现功能增加,若增加需更改多个原本实例化的对象。
小结
类别 | 简单工厂模式 | 工厂方法模式 | 抽象工厂模式 |
工厂 | 具体工厂 | 抽象工厂类 | 抽象工厂 |
产品 | 抽象产品 | 抽象产品类 | 抽象产品 |
产品实例创建 | 工厂实例创建产品实例 | 具体的工厂类创建具体产品实例 | 工厂在创建时一起创建产品实例(一套) |
适用范围 | 同一等级结构中的任意产品 | 同一等级结构中的固定产品 | 不同产品族的全部产品 |
例子 | 一个后花园只种蔬菜 | 后花园蔬菜品种繁多 | 扩大规模南方一个北方一个 |
联系 | 具体————> 抽象 |