生活中的例子:
车有很多的品牌, 宝马,奔驰等, 制造汽车的工厂就是抽象出来的工厂, 而制造宝马汽车的工厂 ,就是具体的产品工厂,这就是工厂方法的应用场景
定义
工厂方法模式: 定义一个创建对象的接口, 让子类决定实例化哪一个类, 工厂方法使一个类的实例化延伸到了子类
模式结构
Creator: 抽象工厂, 声明工厂方法
ConcreteCreator: 具体工厂,创建具体产品对象
Product:抽象产品,声明产品共有的接口
ConcreteProduct:具体产品
模式实现
在<<简单工厂模式>>中说道, 工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,但是增加新的功能需要修改工厂类中额case分支条件,修改原有的类,违背了开闭原则
下图是对简单工厂模式的结构改进
把简单工厂类中的逻辑判断移到客户端, 当增加减法时,增加减法类和和减法工厂类,而不是修改原来的类
下面是工厂方法的实现
场景:雷锋帮助孤寡老人, 大学生帮助孤寡老人, 志愿者帮助孤寡老人
场景分析:雷锋是可以抽象为 乐于帮助人的群体,大学生和志愿者是具体的群体
下载代码,解压后目录如下图:
优缺点
优点:克服了简单工厂模式违背开闭原则,又保持了封装对象创建过程的优点
缺点:每增加一个产品,就需要加一个产品工厂类,增加了额外的开发量
使用场景
一个类想要由自己的子类来定义某对象的创建过程。