工厂方法模式 创建型 设计模式(三)
工厂方法模式是简单工厂模式的进一步抽象
工厂方法模式既保持了简单工厂模式的优点,又克服了他的缺点
如不清楚简单工厂模式,可以查看前一篇
他是怎么做到的呢?那就是:
核心的工厂角色,不再是具体的工厂,也就是不再负责所有具体产品的创建,进一步转变为抽象角色。
他仅仅提供具体工厂子类必须实现的接口??,不再关心应该实例化哪个具体的产品类
具体创建的工作的细节全部交给子类工厂去做
简言之,从一个类包打天下(简单工厂模式),转换为兄弟姐妹一起上(工厂方法)
意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类 工厂方法模式使一个类的实例化,延时到其子类(就是在说,子类负责具体产品类的实例化) 别名:虚构造器结构
抽象产品Product 产品抽象角色,工厂创建具体的对象的超类或共同接口 具体产品ConcreteProduct 实现了抽象产品Product,ConcreteProduct1 和ConcreteProduct2为具体的产品 抽象工厂Creator 工厂模式的核心,与应用程序无关,所有的工厂都需要实现抽象工厂角色 具体工厂ConcreteCreator 实现了工厂接口的具体的Java类,用于产生具体的产品 工厂模式相对于简单工厂模式,产品侧的结构形式不变 而对于工厂,变化很清晰明显 不再是单一的Java类承担所有的对象创建职责 而是存在工厂的体系结构 Creator作为创建工厂的抽象角色,提供了创建协议,也就是一个方法,约定了我们将要创建什么范畴的产品 ConcreteCreator1和ConcreteCreator2 是具体的工厂,他们都实现Creator,针对不同的产品有不同的工厂 也就是产品等级结构是什么样的,就有一个类似结构的工厂等级结构 对应着的工厂创建对应着的产品 就像上图中那样,两个圈中的层级结构是对称的,一 一对应的 Creator对应Product ConcreteCreator1对应ConcreteProduct1 ConcreteCreator2对应ConcreteProduct2 ......示例代码
还是以水果的为例 Fruit Apple Orange与简单工厂模式中一样 此时,不再是一个水果店卖所有的水果,而是不同的水果店销售不同的水果 所以对应水果这种产品的等级结构,也有对应的工厂等级结构 Factory以及 AppleFactory和 OrangeFactory Fruit Apple 和Orange与简单工厂中的代码相同,请参见上一篇文章,不再赘述package factory; /** * Created by noteless on 2018/10/9. * Description: */ public interface Factory { Fruit create(); }
package factory; /** * Created by noteless on 2018/10/9. * Description: */ public class AppleFactory implements Factory { @Override public Fruit create() { return new Apple(); } }
package factory; /** * Created by noteless on 2018/10/9. * Description: */ public class OrangeFactory implements Factory { @Override public Fruit create() { return new Orange(); } }测试代码 工厂方法模式的特点就是平行的等级结构 ,也就是工厂与产品有相对应的层级结构 而不是像简单工厂模式中那样,一个全能类包揽所有创建逻辑