设计模式学习——工厂模式
说到工厂模式,可能我们脑海中就会蹦出简单工厂、工厂方法以及抽象工厂这几个名词,但是说起他们之间的区别、各自都解决了什么样的问题,那就比较懵了,所以今天我们详细梳理下这三者之间的区别与联系。
一、简单工厂
简单工厂严格来说不能算作一种设计模式,它更像一种编程习惯,用于将具体类的创建从客户端解耦,他的实现很简单,就是建立一个工厂类,通过其create方法,根据所传入参数的不同,返回对应的对象,举例如下:
public class AnimalFactory { public static Animal create(String type) { if ("cat".equals(type)) { return new Cat(); } else if ("dog".equals(type)) { return new Dog(); } else if ("pig".equals(type)) { return new Pig(); } else { return null; } } }
我们可以看到简单工厂确实很简单并且问题也很明显:
1、由于任何动物类都要通过工厂类创建,这就会导致create方法代码量非常庞大
2、不支持扩展,如果在增加新的动物类,就需要修改create方法,不满足开闭原则。
二、工厂方法
对于简单工厂存在的问题,工厂方法恰好能完美解决,工厂方法定义了一个创建对象的接口,由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类。
工厂方法的类图如下:
代码如下:
public abstract class AnimalFactory { public abstract Animal create(); } public class CatFactory extends AnimalFactory{ @Override public Animal create() { return new Cat(); } } public class DogFactory extends AnimalFactory{ @Override public Animal create() { return new Dog(); } } public class PigFactory extends AnimalFactory{ @Override public Animal create() { return new Pig(); } }
我们可以看到工厂方法有以下优点:
1、减轻简单工厂的负担,把一种类交由一种工厂创建
2、支持扩展,当新增一个类时,只需要同步创建对应的工厂即可
当然它也有一些缺点:
对于某一族产品的创建时,它不能很好的支持。
三、抽象工厂
抽象工厂提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。这就很好的解决了工厂方法存在的问题。其类图如下:
通过和工厂方法的类图进行比较,我们可以看出工厂方法是抽象工厂的一种极端情况,而抽象工厂是工厂方法的推广。
四、总结
简单工厂:使用一个工厂对象用来生产同一等级结构中的任意产品。(不支持拓展增加产品)
工厂方法:使用多个工厂对象用来生产同一等级结构中对应的固定产品。(支持拓展增加产品)
抽象工厂:使用多个工厂对象用来生产不同产品族的全部产品。(不支持拓展增加产品;支持增加产品族)