写在前面
- 作用
- 主要作用是解耦对象的创建和使用
- 使代码更好的复合开闭原则,无论是工厂方法中的抽象方法还是抽象工厂中的接口组合产品族都是为了实现对扩展开放对修改关闭的目的
- 降低代码重复,提高代码复用能力
下面以《head first 设计模式》的比萨工厂作为例子
简单工厂(不是设计模式)
- 定义:将创建对象的逻辑统一抽取到一个工厂类,通过对入参类型的判断创建对应的具体实现
- 解决单一维度多个类型(pizza类型)对象的创建问题
- UML
工厂方法模式
- 定义:将工厂的职责(创建具体的实现类)作为一个抽象方法由不同实现定制各自需要的类型,通过让子类决定该创建的对象是什么,达到将对象创建的过程封装分离的目的,工厂方法让类把实例化推迟到子类。比如同样是CheesePizza,北京和伦敦的口味不同,各自实现类可以定制
- 解决两个维度(比如pizza增加地区差别)对应的多个类型问题
- UML
抽象工厂模式
- 抽象工厂是将工厂抽象,提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体的类
- 主要用于创建有关联或者相互以来的对象家族,比如pizza的原料会有很多并且存在关系(都是pizza的组成部分)
- UML
简单工厂&工厂方法&抽象工厂的区别和共同点
- 相同点
- 相比较客户端直接创建实现编程,三个工厂都需要将pizza抽象出来,在所创建的对象上都面向抽象开发
- 不同点
- 简单工厂面向的是单独的一个工厂实现类,新增删除新类型的对象时都需要修改工厂类,违反了开闭原则;而工厂方法和抽象工厂在新增删除新类型对象时是通过增加和删除扩展来实现的
- 工厂方法抽象的是方法,通过让子类实现抽象方法达到扩展的目的,并且可以共用父类通用方法,但是继承关系的耦合度比较高;抽象工厂抽象的是整个类(即接口),接口提供创建一系列相关的对象方法,由子类实现创建各自所需的对象,所以抽象工厂更方便对一个对象家族的扩展
参考
《head first 设计模式》
深入理解工厂模式