概述
- 定义 : 定义一个创建对象的接口, 但让实现这个接口的类来决定实例化哪个类, 工厂方法让类的实例化推迟到子类中进行
- 类型 : 创建型设计模式
模式角色
- Product : 定义工厂方法所创建的对象的接口
- ConcreteProduct : Product接口的实现
- Creator : 声明工厂方法,该方法返回一个Product类型的对象。也可以定义一个工厂方
法的缺省实现,它返回一个缺省的ConcreteProduct对象。 - ConcreteCreator : 重定义工厂方法以创建一个ConcreteProduct实例
适用场景
- 创建对象需要大量重复的代码
- 客户端不依赖于产品类实例如何被创建, 实现等细节
- 一个类通过其子类来指定创建哪个对象
优点
- 用户只需要关系所需产品对应的工厂, 无需关心创建细节
- 加入新产品符合开闭原则, 提高可扩展性
缺点
- 类的个数容易过多, 增加复杂度
- 增加了系统的抽象性和理解难度
代码演示
代码整体UML类图 :
Juice接口, 对应模式中Product角色, 代码如下 :
/**
* 果汁接口类
* @author 七夜雪
* @create 2018-11-22 10:15
*/
public interface Juice {
public String showName();;
}
接口实现类, 对应模式中ConcreteProduct角色, 下面是多个实现类代码:
/**
* 橙汁
*
* @author 七夜雪
* @create 2018-11-22 10:15
*/
public class OrangeJuice implements Juice {
@Override
public String showName() {
return "橙汁";
}
}
/**
* 西瓜汁
*
* @author 七夜雪
* @create 2018-11-22 10:23
*/
public class WatermelonJuice implements Juice {
@Override
public String showName() {
return "西瓜汁";
}
}
/**
* 苹果汁
*
* @author 七夜雪
* @create 2018-11-22 10:17
*/
public class AppleJuice implements Juice {
@Override
public String showName() {
return "苹果汁";
}
}
每个产品都有对应的工厂类, 对应模式中的Creator角色:
/**
* 橙汁工厂
*
* @author 七夜雪
* @create 2018-11-22 11:33
*/
public class OrangeJuiceFactory extends JuiceFactory {
@Override
public Juice getJuice() {
return new OrangeJuice();
}
}
/**
* 西瓜汁工厂
*
* @author 七夜雪
* @create 2018-11-22 11:33
*/
public class WatermelonJuiceFactory extends JuiceFactory {
@Override
public Juice getJuice() {
return new WatermelonJuice();
}
}
/**
* 苹果汁工厂
*
* @author 七夜雪
* @create 2018-11-22 11:33
*/
public class AppleJuiceFactory extends JuiceFactory {
@Override
public Juice getJuice() {
return new AppleJuice();
}
}
测试类代码 :
/**
* 简单工厂测试类
*
* @author 七夜雪
* @create 2018-11-22 10:23
*/
public class Test {
public static void main(String[] args) {
JuiceFactory factory1 = new OrangeJuiceFactory();
Juice juice1 = factory1.getJuice();
System.out.println(juice1.showName());
JuiceFactory factory2 = new AppleJuiceFactory();
Juice juice2 = factory2.getJuice();
System.out.println(juice2.showName());
JuiceFactory factory3 = new WatermelonJuiceFactory();
Juice juice3 = factory3.getJuice();
System.out.println(juice3.showName());
}
}
本文参考:
慕课网<java设计模式精讲 Debug 方式+内存分析>课程
四人帮G<设计模式>